For problem statement at 1000-1999/1800-1899/1840-1849/1844/problemF2.txt this is a correct solution, but verifier at 1000-1999/1800-1899/1840-1849/1844/verifierF2.go ends with wrong answer on test 1
expected: 178 177 170 121 117 104 102 83 48 46 5
got: 178 177 170 121 104 117 102 83 48 46 5 can you fix the verifier? ```go
package main
import (
"io"
"os"
"sort"
"strconv"
)
type FastScanner struct {
data []byte
idx int
}
func NewFastScanner() *FastScanner {
data, _ := io.ReadAll(os.Stdin)
return &FastScanner{data: data}
}
func (fs *FastScanner) NextInt64() int64 {
n := len(fs.data)
for fs.idx < n && fs.data[fs.idx] <= ' ' {
fs.idx++
}
sign := int64(1)
if fs.data[fs.idx] == '-' {
sign = -1
fs.idx++
}
var v int64
for fs.idx < n {
b := fs.data[fs.idx]
if b < '0' || b > '9' {
break
}
v = v*10 + int64(b-'0')
fs.idx++
}
return sign * v
}
func upperBound(a []int64, l, r int, val int64) int {
if l > r {
return l - 1
}
pos := sort.Search(r-l+1, func(i int) bool {
return a[l+i] > val
})
return l + pos - 1
}
func solveLargestBlock(v []int64, k int64, res *[]int64) {
m := len(v)
if m == 0 {
return
}
*res = append(*res, v[0])
if m == 1 {
return
}
prevVal := v[0]
l, r := 1, m-1
for l <= r {
if l == r {
*res = append(*res, v[l])
break
}
currentVal := prevVal
u := l
p := l
chosen := make([]int, 0)
for u < r {
reach := upperBound(v, u, r-1, currentVal+k)
cand := -1
if p == u && u <= reach {
cand = u
}
if reach > p {
limit2 := upperBound(v, p+1, r, v[p]+k)
up2 := reach
if limit2-1 < up2 {
up2 = limit2 - 1
}
low := u
if p+1 > low {
low = p + 1
}
if up2 >= low && up2 > cand {
cand = up2
}
}
if cand == -1 {
break
}
*res = append(*res, v[cand])
chosen = append(chosen, cand)
currentVal = v[cand]
if cand == p {
p++
}
u = cand + 1
}
ptr := len(chosen) - 1
for i := u - 1; i >= l; i-- {
if ptr >= 0 && chosen[ptr] == i {
ptr--
} else {
*res = append(*res, v[i])
}
}
if p < u {
prevVal = v[p]
} else {
prevVal = currentVal
}
l = u
}
}
func appendSeq(out []byte, seq []int64, negate bool) []byte {
for i, v := range seq {
if negate {
v = -v
}
out = strconv.AppendInt(out, v, 10)
if i+1 == len(seq) {
out = append(out, '\n')
} else {
out = append(out, ' ')
}
}
return out
}
func main() {
fs := NewFastScanner()
t := int(fs.NextInt64())
out := make([]byte, 0, 1<<20)
for ; t > 0; t-- {
n := int(fs.NextInt64())
c := fs.NextInt64()
a := make([]int64, n)
for i := 0; i < n; i++ {
a[i] = fs.NextInt64()
}
if c >= 0 {
sort.Slice(a, func(i, j int) bool { return a[i] < a[j] })
out = appendSeq(out, a, false)
} else {
k := -c
x := make([]int64, n)
for i := 0; i < n; i++ {
x[i] = -a[i]
}
sort.Slice(x, func(i, j int) bool { return x[i] < x[j] })
res := make([]int64, 0, n)
for l := 0; l < n; {
r := l
for r+1 < n && x[r+1]-x[r] <= k {
r++
}
solveLargestBlock(x[l:r+1], k, &res)
l = r + 1
}
out = appendSeq(out, res, true)
}
}
_, _ = os.Stdout.Write(out)
}
```