← Home
For problem statement at 1000-1999/1400-1499/1400-1409/1403/problemB.txt this is a correct solution, but verifier at 1000-1999/1400-1499/1400-1409/1403/verifierB.go ends with case 1 failed:
input:
3 1
2 1
3 1
3 3 1 1
expected:
0
got:
5

exit status 1 can you fix the verifier? ```go
package main

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

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Split(bufio.ScanWords)

	buf := make([]byte, 0, 10*1024*1024)
	scanner.Buffer(buf, 10*1024*1024)

	read := func() int {
		scanner.Scan()
		num, _ := strconv.Atoi(scanner.Text())
		return num
	}

	if !scanner.Scan() {
		return
	}
	N, _ := strconv.Atoi(scanner.Text())
	Q := read()

	adj := make([][]int, N+1)
	orig_degree := make([]int, N+1)
	for i := 0; i < N-1; i++ {
		u, v := read(), read()
		adj[u] = append(adj[u], v)
		adj[v] = append(adj[v], u)
		orig_degree[u]++
		orig_degree[v]++
	}

	L_total := 0
	for i := 1; i <= N; i++ {
		if orig_degree[i] == 1 {
			L_total++
		}
	}

	tin := make([]int, N+1)
	tout := make([]int, N+1)
	up := make([][20]int, N+1)
	depth := make([]int, N+1)
	l_orig := make([]int, N+1)
	timer := 0

	var dfs1 func(u, p int)
	dfs1 = func(u, p int) {
		timer++
		tin[u] = timer
		up[u][0] = p
		for i := 1; i < 20; i++ {
			up[u][i] = up[up[u][i-1]][i-1]
		}

		if orig_degree[u] == 1 {
			l_orig[u] = 1
		}
		for _, v := range adj[u] {
			if v != p {
				depth[v] = depth[u] + 1
				dfs1(v, u)
				l_orig[u] += l_orig[v]
			}
		}
		tout[u] = timer
	}

	depth[1] = 0
	dfs1(1, 1)

	Dist_even := make([]int, N+1)
	Dist_odd := make([]int, N+1)
	TotalOriginalEvenCount := 0

	var dfs2 func(u, p int)
	dfs2 = func(u, p int) {
		for _, v := range adj[u] {
			if v != p {
				if l_orig[v]%2 == 0 {
					Dist_even[v] = Dist_even[u] + 1
					Dist_odd[v] = Dist_odd[u]
					TotalOriginalEvenCount++
				} else {
					Dist_even[v] = Dist_even[u]
					Dist_odd[v] = Dist_odd[u] + 1
				}
				dfs2(v, u)
			}
		}
	}
	dfs2(1, 1)

	get_lca := func(u, v int) int {
		if depth[u] < depth[v] {
			u, v = v, u
		}
		diff := depth[u] - depth[v]
		for i := 0; i < 20; i++ {
			if (diff & (1 << i)) != 0 {
				u = up[u][i]
			}
		}
		if u == v {
			return u
		}
		for i := 19; i >= 0; i-- {
			if up[u][i] != up[v][i] {
				u = up[u][i]
				v = up[v][i]
			}
		}
		return up[u][0]
	}

	count := make([]int, N+1)
	C := make([]int, 0, N)
	virt_adj := make([][]int, N+1)
	is_F := make([]bool, N+1)

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	for q := 0; q < Q; q++ {
		D_i := read()
		C = C[:0]
		for j := 0; j < D_i; j++ {
			u := read()
			if count[u] == 0 {
				C = append(C, u)
			}
			count[u]++
		}

		newLeaves := L_total + D_i
		for _, u := range C {
			if orig_degree[u] == 1 {
				newLeaves--
			}
		}

		if newLeaves%2 != 0 {
			fmt.Fprintln(out, "-1")
			for _, u := range C {
				count[u] = 0
			}
			continue
		}

		S_initial := make([]int, 0, len(C))
		for _, u := range C {
			c_u := count[u]
			f_u := 0
			if orig_degree[u] == 1 {
				if c_u%2 == 0 {
					f_u = 1
				}
			} else {
				if c_u%2 != 0 {
					f_u = 1
				}
			}
			if f_u == 1 {
				S_initial = append(S_initial, u)
			}
		}

		S := make([]int, len(S_initial))
		copy(S, S_initial)
		has_root := false
		for _, u := range S {
			if u == 1 {
				has_root = true
				break
			}
		}
		if !has_root {
			S = append(S, 1)
		}

		for _, u := range S_initial {
			is_F[u] = true
		}

		sort.Slice(S, func(i, j int) bool { return tin[S[i]] < tin[S[j]] })
		m := len(S)
		for i := 0; i < m-1; i++ {
			lca := get_lca(S[i], S[i+1])
			S = append(S, lca)
		}

		sort.Slice(S, func(i, j int) bool { return tin[S[i]] < tin[S[j]] })
		uniqueS := []int{S[0]}
		for i := 1; i < len(S); i++ {
			if S[i] != S[i-1] {
				uniqueS = append(uniqueS, S[i])
			}
		}
		S = uniqueS

		for _, u := range S {
			virt_adj[u] = virt_adj[u][:0]
		}

		stack := []int{S[0]}
		for i := 1; i < len(S); i++ {
			v := S[i]
			for len(stack) > 0 {
				top := stack[len(stack)-1]
				if tin[top] <= tin[v] && tout[v] <= tout[top] {
					break
				}
				stack = stack[:len(stack)-1]
			}
			p := stack[len(stack)-1]
			virt_adj[p] = append(virt_adj[p], v)
			stack = append(stack, v)
		}

		flip_count := 0
		var dp func(u int) int
		dp = func(u int) int {
			w := 0
			if is_F[u] {
				w = 1
			}
			for _, v := range virt_adj[u] {
				child_w := dp(v)
				w = (w + child_w) % 2
				if child_w == 1 {
					e_even := Dist_even[v] - Dist_even[u]
					e_odd := Dist_odd[v] - Dist_odd[u]
					flip_count += e_odd - e_even
				}
			}
			return w
		}

		dp(S[0])

		ans := (N - 1 + D_i) + TotalOriginalEvenCount + flip_count
		fmt.Fprintln(out, ans)

		for _, u := range S_initial {
			is_F[u] = false
		}
		for _, u := range C {
			count[u] = 0
		}
	}
}
```