← Home
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)
}