For problem statement at 1000-1999/1400-1499/1440-1449/1446/problemF.txt this is a correct solution, but verifier at 1000-1999/1400-1499/1440-1449/1446/verifierF.go ends with All 105 tests passed can you fix the verifier? package main
import (
"bufio"
"fmt"
"math"
"os"
"sort"
)
func main() {
reader := bufio.NewReader(os.Stdin)
var n int
var k int64
fmt.Fscan(reader, &n, &k)
R := make([]float64, n)
Phi := make([]float64, n)
for i := 0; i < n; i++ {
var x, y float64
fmt.Fscan(reader, &x, &y)
R[i] = math.Hypot(x, y)
Phi[i] = math.Atan2(y, x)
if Phi[i] < 0 {
Phi[i] += 2 * math.Pi
}
}
low, high := 0.0, 20000.0
type interval struct {
U, V int
}
pointsS := make([]struct{ u, v float64 }, 0, n)
events := make([]float64, 0, 2*n)
intervals := make([]interval, 0, n)
bit := make([]int, 2*n+2)
for iter := 0; iter < 60; iter++ {
mid := (low + high) / 2.0
pointsS = pointsS[:0]
for i := 0; i < n; i++ {
if R[i] > mid {
ratio := mid / R[i]
if ratio > 1.0 {
ratio = 1.0
}
delta := math.Acos(ratio)
a := Phi[i] - delta
if a < 0 {
a += 2 * math.Pi
}
b := Phi[i] + delta
if b >= 2*math.Pi {
b -= 2 * math.Pi
}
if a > b {
a, b = b, a
}
pointsS = append(pointsS, struct{ u, v float64 }{a, b})
}
}
m := len(pointsS)
if m == 0 {
high = mid
continue
}
events = events[:0]
for i := 0; i < m; i++ {
events = append(events, pointsS[i].u, pointsS[i].v)
}
sort.Float64s(events)
uniqueCount := 0
for i, e := range events {
if i == 0 || e != events[i-1] {
events[uniqueCount] = e
uniqueCount++
}
}
uniqueEvents := events[:uniqueCount]
getRank := func(val float64) int {
l, r := 0, uniqueCount-1
for l <= r {
mIdx := l + (r - l) / 2
if uniqueEvents[mIdx] == val {
return mIdx + 1
} else if uniqueEvents[mIdx] < val {
l = mIdx + 1
} else {
r = mIdx - 1
}
}
return l + 1
}
intervals = intervals[:0]
for i := 0; i < m; i++ {
U := getRank(pointsS[i].u)
V := getRank(pointsS[i].v)
if U == V {
continue
}
if U > V {
U, V = V, U
}
intervals = append(intervals, interval{U, V})
}
sort.Slice(intervals, func(i, j int) bool {
if intervals[i].U != intervals[j].U {
return intervals[i].U < intervals[j].U
}
return intervals[i].V < intervals[j].V
})
nBIT := uniqueCount
for i := 0; i <= nBIT; i++ {
bit[i] = 0
}
add := func(idx int, val int) {
for ; idx <= nBIT; idx += idx & -idx {
bit[idx] += val
}
}
query := func(idx int) int {
sum := 0
for ; idx > 0; idx -= idx & -idx {
sum += bit[idx]
}
return sum
}
var ans int64 = 0
for i := 0; i < len(intervals); {
j := i
for j < len(intervals) && intervals[j].U == intervals[i].U {
j++
}
for k := i; k < j; k++ {
ans += int64(query(intervals[k].V-1) - query(intervals[k].U))
}
for k := i; k < j; k++ {
add(intervals[k].V, 1)
}
i = j
}
totalPairs := int64(n) * int64(n-1) / 2
pairsLessOrEqual := totalPairs - ans
if pairsLessOrEqual >= k {
high = mid
} else {
low = mid
}
}
fmt.Printf("%.9f\n", low)
}