← Home
For problem statement at 1000-1999/1600-1699/1620-1629/1626/problemE.txt this is a correct solution, but verifier at 1000-1999/1600-1699/1620-1629/1626/verifierE.go ends with All tests passed can you fix the verifier? package main

import (
	"bufio"
	"os"
	"strconv"
)

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

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

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

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

	c := make([]int, n+1)
	totBlack := 0
	for i := 1; i <= n; i++ {
		c[i] = scanInt()
		if c[i] == 1 {
			totBlack++
		}
	}

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

	sub := make([]int, n+1)
	revAdj := make([][]int, n+1)

	var dfs func(int, int)
	dfs = func(u, p int) {
		if c[u] == 1 {
			sub[u] = 1
		}
		for _, v := range adj[u] {
			if v != p {
				dfs(v, u)
				sub[u] += sub[v]

				C_uv := sub[v]
				if c[v] == 1 || C_uv >= 2 {
					revAdj[v] = append(revAdj[v], u)
				}

				C_vu := totBlack - sub[v]
				if c[u] == 1 || C_vu >= 2 {
					revAdj[u] = append(revAdj[u], v)
				}
			}
		}
	}
	dfs(1, 0)

	queue := make([]int, 0, n)
	visited := make([]bool, n+1)

	for i := 1; i <= n; i++ {
		if c[i] == 1 {
			visited[i] = true
			queue = append(queue, i)
		}
	}

	for head := 0; head < len(queue); head++ {
		u := queue[head]
		for _, v := range revAdj[u] {
			if !visited[v] {
				visited[v] = true
				queue = append(queue, v)
			}
		}
	}

	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()
	for i := 1; i <= n; i++ {
		if visited[i] {
			out.WriteString("1 ")
		} else {
			out.WriteString("0 ")
		}
	}
	out.WriteString("\n")
}