For problem statement at 0-999/800-899/810-819/815/problemC.txt this is a correct solution, but verifier at 0-999/800-899/810-819/815/verifierC.go ends with case 1 failed: expected 2 got 3
input:
3 32
33 20
34 16 1
4 2 1
exit status 1 can you fix the verifier? ```go
package main
import (
"bufio"
"fmt"
"os"
"sort"
)
var reader = bufio.NewReader(os.Stdin)
var writer = bufio.NewWriter(os.Stdout)
func min(a, b int64) int64 {
if a < b {
return a
}
return b
}
const INF int64 = 1000000000000000000 + 10
var N int
var B int64
var C, D, Size [5010]int64
var Child [5010][]int
var dpNot, dpUse [5010][]int64
func dfs(u int) {
var costs []int64
costs = append(costs, C[u])
Size[u] = 1
for _, v := range Child[u] {
dfs(v)
Size[u] += Size[v]
ssv := int(Size[v])
for k := 1; k <= ssv; k++ {
costs = append(costs, dpNot[v][k]-dpNot[v][k-1])
}
}
sort.Slice(costs, func(i, j int) bool { return costs[i] < costs[j] })
sz := int(Size[u])
dpNot[u] = make([]int64, sz+1)
dpNot[u][0] = 0
for i := 1; i <= sz; i++ {
dpNot[u][i] = dpNot[u][i-1] + costs[i-1]
}
dpUse[u] = make([]int64, sz+1)
for i := 0; i <= sz; i++ {
dpUse[u][i] = INF
}
if len(Child[u]) == 0 {
dpUse[u][1] = C[u] - D[u]
return
}
maxv := -1
maxsz := int64(0)
for _, v := range Child[u] {
if Size[v] > maxsz {
maxsz = Size[v]
maxv = v
}
}
cur := make([]int64, sz+1)
copy(cur, dpUse[maxv])
for _, v := range Child[u] {
if v == maxv {
continue
}
nxt := make([]int64, sz+1)
for i := 0; i <= sz; i++ {
nxt[i] = INF
}
ssv := int(Size[v])
maxI := sz - ssv
for i := 0; i <= maxI; i++ {
if cur[i] == INF {
continue
}
for j := 0; j <= ssv; j++ {
ni := i + j
nxt[ni] = min(nxt[ni], cur[i] + dpNot[v][j])
}
for j := 1; j <= ssv; j++ {
if dpUse[v][j] == INF {
continue
}
ni := i + j
if ni > sz {
break
}
nxt[ni] = min(nxt[ni], cur[i] + dpUse[v][j])
}
}
cur = nxt
}
for i := 0; i < sz; i++ {
if cur[i] == INF {
continue
}
dpUse[u][i+1] = cur[i] + C[u] - D[u]
}
}
func main() {
fmt.Fscan(reader, &N, &B)
for i := 1; i <= N; i++ {
fmt.Fscan(reader, &C[i], &D[i])
if i >= 2 {
var x int
fmt.Fscan(reader, &x)
Child[x] = append(Child[x], i)
}
}
dfs(1)
l, r := 0, N
for l < r {
mid := (l + r + 1) / 2
var minc int64 = INF
if mid < len(dpNot[1]) {
minc = dpNot[1][mid]
}
if mid < len(dpUse[1]) {
minc = min(minc, dpUse[1][mid])
}
if minc <= B {
l = mid
} else {
r = mid - 1
}
}
fmt.Println(l)
}
```