← Home
For problem statement at 2000-2999/2000-2099/2040-2049/2046/problemC.txt this is a correct solution, but verifier at 2000-2999/2000-2099/2040-2049/2046/verifierC.go ends with All 6 tests passed can you fix the verifier? package main

import (
	"bufio"
	"bytes"
	"io"
	"os"
	"sort"
	"strconv"
)

type Point struct {
	x int
	y int
}

type Fenwick struct {
	n      int
	bit    []int
	maxPow int
}

func NewFenwick(n int) *Fenwick {
	p := 1
	for p < n {
		p <<= 1
	}
	return &Fenwick{
		n:      n,
		bit:    make([]int, n+1),
		maxPow: p,
	}
}

func (f *Fenwick) Clear() {
	for i := range f.bit {
		f.bit[i] = 0
	}
}

func (f *Fenwick) Build(freq []int) {
	copy(f.bit, freq)
	for i := 1; i <= f.n; i++ {
		j := i + (i & -i)
		if j <= f.n {
			f.bit[j] += f.bit[i]
		}
	}
}

func (f *Fenwick) Add(i, delta int) {
	for i <= f.n {
		f.bit[i] += delta
		i += i & -i
	}
}

func (f *Fenwick) Kth(k int) int {
	idx := 0
	b := f.maxPow
	for b > 0 {
		next := idx + b
		if next <= f.n && f.bit[next] < k {
			idx = next
			k -= f.bit[next]
		}
		b >>= 1
	}
	return idx + 1
}

type Solver struct {
	points []Point
	ys     []int
	freq   []int
	left   *Fenwick
	right  *Fenwick
	n      int
}

func (s *Solver) Check(k int) (bool, int, int) {
	if k == 0 {
		return true, 0, 0
	}
	if 4*k > s.n {
		return false, 0, 0
	}
	s.left.Clear()
	s.right.Build(s.freq)

	leftCount := 0
	i := 0
	for i < s.n {
		x0 := s.points[i].x
		rightCount := s.n - leftCount

		if leftCount >= 2*k && rightCount >= 2*k {
			lowL := s.ys[s.left.Kth(k)-1]
			highL := s.ys[s.left.Kth(leftCount-k+1)-1]
			lowR := s.ys[s.right.Kth(k)-1]
			highR := s.ys[s.right.Kth(rightCount-k+1)-1]

			low := lowL
			if lowR > low {
				low = lowR
			}
			high := highL
			if highR < high {
				high = highR
			}

			if low+1 <= high {
				return true, x0, low + 1
			}
		}

		for i < s.n && s.points[i].x == x0 {
			id := s.points[i].y
			s.left.Add(id, 1)
			s.right.Add(id, -1)
			leftCount++
			i++
		}
	}

	return false, 0, 0
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextInt := func() int {
		for idx < len(data) {
			c := data[idx]
			if c > ' ' {
				break
			}
			idx++
		}
		sign := 1
		if data[idx] == '-' {
			sign = -1
			idx++
		}
		val := 0
		for idx < len(data) {
			c := data[idx]
			if c < '0' || c > '9' {
				break
			}
			val = val*10 + int(c-'0')
			idx++
		}
		return sign * val
	}

	t := nextInt()
	var out bytes.Buffer

	for ; t > 0; t-- {
		n := nextInt()
		points := make([]Point, n)
		ys := make([]int, n)
		for i := 0; i < n; i++ {
			x := nextInt()
			y := nextInt()
			points[i] = Point{x: x, y: y}
			ys[i] = y
		}

		sort.Ints(ys)
		m := 0
		for _, v := range ys {
			if m == 0 || ys[m-1] != v {
				ys[m] = v
				m++
			}
		}
		ys = ys[:m]

		freq := make([]int, m+1)
		for i := 0; i < n; i++ {
			id := sort.SearchInts(ys, points[i].y) + 1
			points[i].y = id
			freq[id]++
		}

		sort.Slice(points, func(i, j int) bool {
			return points[i].x < points[j].x
		})

		s := Solver{
			points: points,
			ys:     ys,
			freq:   freq,
			left:   NewFenwick(m),
			right:  NewFenwick(m),
			n:      n,
		}

		ansK, ansX, ansY := 0, 0, 0
		l, r := 1, n/4
		for l <= r {
			mid := (l + r) >> 1
			ok, x0, y0 := s.Check(mid)
			if ok {
				ansK, ansX, ansY = mid, x0, y0
				l = mid + 1
			} else {
				r = mid - 1
			}
		}

		out.WriteString(strconv.Itoa(ansK))
		out.WriteByte('\n')
		if ansK == 0 {
			out.WriteString("0 0\n")
		} else {
			out.WriteString(strconv.Itoa(ansX))
			out.WriteByte(' ')
			out.WriteString(strconv.Itoa(ansY))
			out.WriteByte('\n')
		}
	}

	w := bufio.NewWriterSize(os.Stdout, 1<<20)
	w.Write(out.Bytes())
	w.Flush()
}