For problem statement at 2000-2999/2100-2199/2160-2169/2167/problemE.txt this is a correct solution, but verifier at 2000-2999/2100-2199/2160-2169/2167/verifierE.go ends with candidate does not match reference stub
exit status 1 can you fix the verifier? package main
import (
"bufio"
"io"
"os"
"sort"
"strconv"
"strings"
)
type FastScanner struct {
data []byte
idx int
}
func NewFastScanner() *FastScanner {
b, _ := io.ReadAll(os.Stdin)
b = append(b, 0)
return &FastScanner{data: b, idx: 0}
}
func (fs *FastScanner) NextInt64() int64 {
b := fs.data
i := fs.idx
for b[i] <= ' ' {
i++
}
sign := int64(1)
if b[i] == '-' {
sign = -1
i++
}
val := int64(0)
for b[i] >= '0' && b[i] <= '9' {
val = val*10 + int64(b[i]-'0')
i++
}
fs.idx = i
return val * sign
}
func feasible(a []int64, n int, k int64, x int64, R int64) bool {
if R == 0 {
return int64(x+1) >= k
}
rad := R - 1
var count int64 = 0
have := false
var L, Rr int64
for i := 0; i < n; i++ {
l := a[i] - rad
if l < 0 {
l = 0
}
r := a[i] + rad
if r > x {
r = x
}
if !have {
L, Rr = l, r
have = true
if L > 0 {
count += L
if count >= k {
return true
}
}
} else {
if l <= Rr+1 {
if r > Rr {
Rr = r
}
} else {
gap := l - Rr - 1
if gap > 0 {
count += gap
if count >= k {
return true
}
}
L, Rr = l, r
}
}
}
if have {
tail := x - Rr
if tail > 0 {
count += tail
if count >= k {
return true
}
}
} else {
return int64(x+1) >= k
}
return count >= k
}
func generatePositions(a []int64, n int, k int64, x int64, R int64) []int64 {
ans := make([]int64, 0, k)
if R == 0 {
for p := int64(0); int64(len(ans)) < k; p++ {
ans = append(ans, p)
}
return ans
}
rad := R - 1
have := false
var Rr int64
addRange := func(start, end int64) {
for p := start; p <= end && int64(len(ans)) < k; p++ {
ans = append(ans, p)
}
}
for i := 0; i < n && int64(len(ans)) < k; i++ {
l := a[i] - rad
if l < 0 {
l = 0
}
r := a[i] + rad
if r > x {
r = x
}
if !have {
if l > 0 {
addRange(0, l-1)
}
Rr = r
have = true
} else {
if l <= Rr+1 {
if r > Rr {
Rr = r
}
} else {
addRange(Rr+1, l-1)
Rr = r
}
}
}
if int64(len(ans)) < k {
if have {
if Rr+1 <= x {
addRange(Rr+1, x)
}
} else {
addRange(0, x)
}
}
if int64(len(ans)) > k {
ans = ans[:k]
}
return ans
}
func main() {
in := NewFastScanner()
out := bufio.NewWriter(os.Stdout)
defer out.Flush()
t := int(in.NextInt64())
var sb strings.Builder
for ; t > 0; t-- {
n := int(in.NextInt64())
k := in.NextInt64()
x := in.NextInt64()
a := make([]int64, n)
for i := 0; i < n; i++ {
a[i] = in.NextInt64()
}
sort.Slice(a, func(i, j int) bool { return a[i] < a[j] })
lo := int64(0)
hi := x
for lo < hi {
mid := (lo + hi + 1) >> 1
if feasible(a, n, k, x, mid) {
lo = mid
} else {
hi = mid - 1
}
}
R := lo
pos := generatePositions(a, n, k, x, R)
for i := 0; i < len(pos); i++ {
if i > 0 {
sb.WriteByte(' ')
}
sb.WriteString(strconv.FormatInt(pos[i], 10))
}
sb.WriteByte('\n')
}
out.WriteString(sb.String())
}