For problem statement at 0-999/300-399/300-309/303/problemC.txt this is a correct solution, but verifier at 0-999/300-399/300-309/303/verifierC.go ends with All 100 tests passed can you fix the verifier? package main
import (
"bufio"
"fmt"
"io"
"os"
"sort"
)
func ufFind(parent *[20]int, x int) int {
for (*parent)[x] != x {
(*parent)[x] = (*parent)[(*parent)[x]]
x = (*parent)[x]
}
return x
}
func exactCheck(m, k, dmax int, diffFreq []int, start []int, pairs []uint32) bool {
var edges [10]uint32
e := 0
for d := m; d <= dmax; d += m {
if diffFreq[d] == 0 {
continue
}
l, r := start[d], start[d+1]
for i := l; i < r; i++ {
edges[e] = pairs[i]
e++
}
}
var verts [20]uint16
var parent [20]int
vc := 0
for i := 0; i < e; i++ {
p := edges[i]
u := uint16(p >> 16)
v := uint16(p)
iu := -1
for j := 0; j < vc; j++ {
if verts[j] == u {
iu = j
break
}
}
if iu < 0 {
iu = vc
verts[vc] = u
parent[vc] = vc
vc++
}
iv := -1
for j := 0; j < vc; j++ {
if verts[j] == v {
iv = j
break
}
}
if iv < 0 {
iv = vc
verts[vc] = v
parent[vc] = vc
vc++
}
ru := ufFind(&parent, iu)
rv := ufFind(&parent, iv)
if ru != rv {
parent[ru] = rv
}
}
roots := 0
for i := 0; i < vc; i++ {
if ufFind(&parent, i) == i {
roots++
}
}
return vc-roots <= k
}
func main() {
data, _ := io.ReadAll(os.Stdin)
idx := 0
nextInt := func() int {
for idx < len(data) && (data[idx] < '0' || data[idx] > '9') && data[idx] != '-' {
idx++
}
sign := 1
if data[idx] == '-' {
sign = -1
idx++
}
val := 0
for idx < len(data) && data[idx] >= '0' && data[idx] <= '9' {
val = val*10 + int(data[idx]-'0')
idx++
}
return sign * val
}
n := nextInt()
k := nextInt()
a := make([]int, n)
for i := 0; i < n; i++ {
a[i] = nextInt()
}
sort.Ints(a)
lb := n - k
if lb < 1 {
lb = 1
}
dmax := a[n-1] - a[0]
diffFreq := make([]int, dmax+1)
for i := 0; i < n; i++ {
ai := a[i]
for j := i + 1; j < n; j++ {
diffFreq[a[j]-ai]++
}
}
upper := k * (k + 1) / 2
var start []int
var pairs []uint32
if upper > k {
start = make([]int, dmax+2)
for d := 1; d <= dmax; d++ {
start[d+1] = start[d] + diffFreq[d]
}
totalPairs := n * (n - 1) / 2
pairs = make([]uint32, totalPairs)
nextPos := make([]int, dmax+1)
copy(nextPos, start[:dmax+1])
for i := 0; i < n; i++ {
ai := a[i]
for j := i + 1; j < n; j++ {
d := a[j] - ai
pairs[nextPos[d]] = (uint32(i) << 16) | uint32(j)
nextPos[d]++
}
}
}
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
for m := lb; m <= dmax; m++ {
sum := 0
for d := m; d <= dmax; d += m {
sum += diffFreq[d]
if sum > upper {
break
}
}
if sum <= k {
fmt.Fprintln(out, m)
return
}
if sum <= upper && exactCheck(m, k, dmax, diffFreq, start, pairs) {
fmt.Fprintln(out, m)
return
}
}
ans := dmax + 1
if ans < lb {
ans = lb
}
fmt.Fprintln(out, ans)
}