← Home
For problem statement at 1000-1999/1900-1999/1940-1949/1949/problemC.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1940-1949/1949/verifierC.go ends with All tests passed can you fix the verifier? package main

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

func nextInt(reader *bufio.Reader) int {
	sign := 1
	val := 0
	c, err := reader.ReadByte()
	for err == nil && (c < '0' || c > '9') && c != '-' {
		c, err = reader.ReadByte()
	}
	if err != nil {
		return 0
	}
	if c == '-' {
		sign = -1
		c, _ = reader.ReadByte()
	}
	for c >= '0' && c <= '9' {
		val = val*10 + int(c-'0')
		c, err = reader.ReadByte()
		if err != nil {
			break
		}
	}
	return sign * val
}

func build(adj [][]int, root int) ([]int, []int) {
	n := len(adj)
	parent := make([]int, n)
	for i := range parent {
		parent[i] = -1
	}
	stack := make([]int, 0, n)
	order := make([]int, 0, n)
	parent[root] = -2
	stack = append(stack, root)
	for len(stack) > 0 {
		v := stack[len(stack)-1]
		stack = stack[:len(stack)-1]
		order = append(order, v)
		for _, u := range adj[v] {
			if parent[u] == -1 {
				parent[u] = v
				stack = append(stack, u)
			}
		}
	}
	size := make([]int, n)
	for i := len(order) - 1; i >= 0; i-- {
		v := order[i]
		sz := 1
		for _, u := range adj[v] {
			if parent[u] == v {
				sz += size[u]
			}
		}
		size[v] = sz
	}
	parent[root] = -1
	return parent, size
}

func centroids(adj [][]int) []int {
	n := len(adj)
	parent, size := build(adj, 0)
	res := []int{}
	for v := 0; v < n; v++ {
		maxPart := n - size[v]
		for _, u := range adj[v] {
			if parent[u] == v {
				if size[u] > maxPart {
					maxPart = size[u]
				}
			}
		}
		if maxPart*2 <= n {
			res = append(res, v)
		}
	}
	return res
}

func validWithRoot(adj [][]int, r int) bool {
	parent, size := build(adj, r)
	n := len(adj)
	for v := 0; v < n; v++ {
		childrenSizes := make([]int, 0, len(adj[v]))
		for _, u := range adj[v] {
			if parent[u] == v {
				childrenSizes = append(childrenSizes, size[u])
			}
		}
		if len(childrenSizes) == 0 {
			continue
		}
		sort.Ints(childrenSizes)
		cur := 1
		for _, a := range childrenSizes {
			if a > cur {
				return false
			}
			cur += a
		}
	}
	return true
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	n := nextInt(reader)
	adj := make([][]int, n)
	for i := 0; i < n-1; i++ {
		u := nextInt(reader) - 1
		v := nextInt(reader) - 1
		adj[u] = append(adj[u], v)
		adj[v] = append(adj[v], u)
	}
	if n == 1 {
		fmt.Println("YES")
		return
	}
	cents := centroids(adj)
	for _, r := range cents {
		if validWithRoot(adj, r) {
			fmt.Println("YES")
			return
		}
	}
	fmt.Println("NO")
}