← Home
For problem statement at 0-999/500-599/530-539/533/problemA.txt this is a correct solution, but verifier at 0-999/500-599/530-539/533/verifierA.go ends with wrong answer on test 6
Input:
7
10 4 8 3 6 5 7
1 2
1 3
2 4
2 5
3 6
6 7
5
5 6 7 8 9
Expected: 2
Got: 3
exit status 1 can you fix the verifier? package main

import (
	"bufio"
	"fmt"
	"io"
	"os"
	"sort"
)

var data []byte
var ptr int

func nextInt() int {
	for ptr < len(data) && (data[ptr] < '0' || data[ptr] > '9') {
		ptr++
	}
	v := 0
	for ptr < len(data) && data[ptr] >= '0' && data[ptr] <= '9' {
		v = v*10 + int(data[ptr]-'0')
		ptr++
	}
	return v
}

func main() {
	data, _ = io.ReadAll(os.Stdin)

	n := nextInt()
	h := make([]int, n+1)
	for i := 1; i <= n; i++ {
		h[i] = nextInt()
	}

	head := make([]int, n+1)
	for i := 1; i <= n; i++ {
		head[i] = -1
	}
	to := make([]int, 2*(n-1))
	nxt := make([]int, 2*(n-1))
	ec := 0
	addEdge := func(a, b int) {
		to[ec] = b
		nxt[ec] = head[a]
		head[a] = ec
		ec++
	}
	for i := 0; i < n-1; i++ {
		a := nextInt()
		b := nextInt()
		addEdge(a, b)
		addEdge(b, a)
	}

	k := nextInt()
	miners := make([]int, k)
	for i := 0; i < k; i++ {
		miners[i] = nextInt()
	}

	const INF = int(1 << 60)

	parent := make([]int, n+1)
	min1 := make([]int, n+1)
	min2 := make([]int, n+1)
	cnt := make([]int, n+1)
	owner := make([]int, n+1)
	ownUnique := make([]int, n+1)
	limit := make([]int, n+1)
	groupSize := make([]int, n+1)

	capacities := make([]int, 0, n)

	min1[1] = h[1]
	min2[1] = INF
	cnt[1] = 1
	owner[1] = 1
	ownUnique[1] = 1
	limit[1] = INF
	groupSize[1]++
	capacities = append(capacities, h[1])

	stack := make([]int, 1, n)
	stack[0] = 1

	for len(stack) > 0 {
		v := stack[len(stack)-1]
		stack = stack[:len(stack)-1]

		for e := head[v]; e != -1; e = nxt[e] {
			u := to[e]
			if u == parent[v] {
				continue
			}
			parent[u] = v
			hv := h[u]

			if hv < min1[v] {
				min1[u] = hv
				min2[u] = min1[v]
				cnt[u] = 1
				owner[u] = u
			} else if hv == min1[v] {
				min1[u] = min1[v]
				min2[u] = min2[v]
				cnt[u] = cnt[v] + 1
				owner[u] = owner[v]
			} else {
				min1[u] = min1[v]
				cnt[u] = cnt[v]
				owner[u] = owner[v]
				if hv < min2[v] {
					min2[u] = hv
				} else {
					min2[u] = min2[v]
				}
			}

			capacities = append(capacities, min1[u])

			if cnt[u] == 1 {
				ou := owner[u]
				ownUnique[u] = ou
				limit[u] = min2[u]
				groupSize[ou]++
			}

			stack = append(stack, u)
		}
	}

	start := make([]int, n+2)
	total := 0
	for i := 1; i <= n; i++ {
		start[i] = total
		total += groupSize[i]
	}
	start[n+1] = total

	allLimits := make([]int, total)
	cur := make([]int, n+1)
	copy(cur, start[:n+1])

	for i := 1; i <= n; i++ {
		if ownUnique[i] != 0 {
			u := ownUnique[i]
			allLimits[cur[u]] = limit[i]
			cur[u]++
		}
	}

	sort.Ints(capacities)
	sort.Ints(miners)

	def := make([]int, k)
	p := n - 1
	D := 0
	for t := k - 1; t >= 0; t-- {
		sv := miners[t]
		for p >= 0 && capacities[p] >= sv {
			p--
		}
		countGe := n - 1 - p
		need := k - t
		d := need - countGe
		def[t] = d
		if d > D {
			D = d
		}
	}

	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	if D == 0 {
		fmt.Fprint(out, 0)
		return
	}

	lowIdx := 0
	for lowIdx < k && def[lowIdx] <= 0 {
		lowIdx++
	}
	lowHeight := miners[lowIdx]

	req := make([]int, D)
	filled := 0
	for t := k - 1; t >= 0; t-- {
		for filled < def[t] {
			req[filled] = miners[t]
			filled++
		}
	}

	bestH := -1
	for u := 1; u <= n; u++ {
		if h[u] >= lowHeight {
			continue
		}
		l, r := start[u], start[u+1]
		if r-l < D {
			continue
		}
		group := allLimits[l:r]
		sort.Ints(group)
		ok := true
		for j := 0; j < D; j++ {
			if group[len(group)-1-j] < req[j] {
				ok = false
				break
			}
		}
		if ok && h[u] > bestH {
			bestH = h[u]
		}
	}

	if bestH < 0 {
		fmt.Fprint(out, -1)
	} else {
		fmt.Fprint(out, req[0]-bestH)
	}
}