← Home
For problem statement at 0-999/700-799/730-739/736/problemE.txt this is a correct solution, but verifier at 0-999/700-799/730-739/736/verifierE.go ends with all tests passed can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
)

type Player struct {
	score int
	id    int
}

func main() {
	in := bufio.NewReaderSize(os.Stdin, 1<<20)
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	fail := func() {
		fmt.Fprintln(out, "no")
		out.Flush()
		os.Exit(0)
	}

	var m, n int
	if _, err := fmt.Fscan(in, &m, &n); err != nil {
		return
	}

	a := make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(in, &a[i])
	}

	total := int64(m) * int64(m-1)
	var sumTop int64
	for k := 1; k <= n; k++ {
		sumTop += int64(a[k-1])
		bound := int64(k) * int64(2*m-k-1)
		if sumTop > bound {
			fail()
		}
	}

	restPlayers := m - n
	restSum := total - sumTop
	if restSum < 0 {
		fail()
	}

	full := make([]int, m)
	copy(full, a)

	if restPlayers == 0 {
		if restSum != 0 {
			fail()
		}
	} else {
		q := int(restSum / int64(restPlayers))
		r := int(restSum % int64(restPlayers))
		maxTail := q
		if r > 0 {
			maxTail++
		}
		if maxTail > a[n-1] {
			fail()
		}
		for i := 0; i < restPlayers; i++ {
			if i < r {
				full[n+i] = q + 1
			} else {
				full[n+i] = q
			}
		}
		var prefTail int64
		for l := 1; l <= restPlayers; l++ {
			prefTail += int64(full[n+l-1])
			k := n + l
			bound := int64(k) * int64(2*m-k-1)
			if sumTop+prefTail > bound {
				fail()
			}
		}
	}

	asc := make([]int, m)
	for i := 0; i < m; i++ {
		asc[i] = full[m-1-i]
	}

	ans := make([][]byte, m)
	for i := 0; i < m; i++ {
		ans[i] = make([]byte, m)
		ans[i][i] = 'X'
	}

	players := make([]Player, m)
	for i := 0; i < m; i++ {
		players[i] = Player{score: asc[i], id: i}
	}

	for len(players) > 1 {
		sort.Slice(players, func(i, j int) bool {
			if players[i].score != players[j].score {
				return players[i].score < players[j].score
			}
			return players[i].id < players[j].id
		})

		v := players[0]
		d := v.score
		rem := len(players) - 1
		if d < 0 || d > 2*rem {
			fail()
		}

		wins := d / 2
		draw := d % 2

		for i := 1; i < len(players); i++ {
			u := &players[i]
			if i <= wins {
				ans[v.id][u.id] = 'W'
				ans[u.id][v.id] = 'L'
			} else if draw == 1 && i == wins+1 {
				ans[v.id][u.id] = 'D'
				ans[u.id][v.id] = 'D'
				u.score--
			} else {
				ans[v.id][u.id] = 'L'
				ans[u.id][v.id] = 'W'
				u.score -= 2
			}
			if u.score < 0 {
				fail()
			}
		}

		players = players[1:]
	}

	if len(players) == 1 && players[0].score != 0 {
		fail()
	}

	fmt.Fprintln(out, "yes")
	for i := 0; i < m; i++ {
		out.Write(ans[i])
		out.WriteByte('\n')
	}
}