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')
}
}