← Home
For problem statement at 1000-1999/1600-1699/1630-1639/1632/problemE2.txt this is a correct solution, but verifier at 1000-1999/1600-1699/1630-1639/1632/verifierE2.go ends with All tests passed can you fix the verifier? package main

import (
	"bytes"
	"io"
	"math/bits"
	"os"
)

type FastScanner struct {
	data []byte
	idx  int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data}
}

func (fs *FastScanner) NextInt() int {
	n := len(fs.data)
	i := fs.idx
	for i < n && (fs.data[i] < '0' || fs.data[i] > '9') {
		i++
	}
	val := 0
	for i < n && fs.data[i] >= '0' && fs.data[i] <= '9' {
		val = val*10 + int(fs.data[i]-'0')
		i++
	}
	fs.idx = i
	return val
}

var up [][]int
var dep []int
var lg int

func lca(u, v int) int {
	if dep[u] < dep[v] {
		u, v = v, u
	}
	diff := dep[u] - dep[v]
	k := 0
	for diff > 0 {
		if diff&1 != 0 {
			u = up[k][u]
		}
		diff >>= 1
		k++
	}
	if u == v {
		return u
	}
	for k = lg - 1; k >= 0; k-- {
		if up[k][u] != up[k][v] {
			u = up[k][u]
			v = up[k][v]
		}
	}
	return up[0][u]
}

func dist(u, v int) int {
	w := lca(u, v)
	return dep[u] + dep[v] - 2*dep[w]
}

func writeInt(out *bytes.Buffer, x int) {
	if x == 0 {
		out.WriteByte('0')
		return
	}
	var buf [20]byte
	i := len(buf)
	for x > 0 {
		i--
		buf[i] = byte('0' + x%10)
		x /= 10
	}
	out.Write(buf[i:])
}

func main() {
	fs := NewFastScanner()
	t := fs.NextInt()
	var out bytes.Buffer

	for ; t > 0; t-- {
		n := fs.NextInt()

		head := make([]int, n+1)
		for i := range head {
			head[i] = -1
		}
		to := make([]int, 2*(n-1))
		next := make([]int, 2*(n-1))
		edgeIdx := 0

		for i := 0; i < n-1; i++ {
			u := fs.NextInt()
			v := fs.NextInt()
			to[edgeIdx] = v
			next[edgeIdx] = head[u]
			head[u] = edgeIdx
			edgeIdx++
			to[edgeIdx] = u
			next[edgeIdx] = head[v]
			head[v] = edgeIdx
			edgeIdx++
		}

		dep = make([]int, n+1)
		parent := make([]int, n+1)
		stack := make([]int, 1, n)
		stack[0] = 1
		h := 0

		for len(stack) > 0 {
			u := stack[len(stack)-1]
			stack = stack[:len(stack)-1]
			for e := head[u]; e != -1; e = next[e] {
				v := to[e]
				if v == parent[u] {
					continue
				}
				parent[v] = u
				dep[v] = dep[u] + 1
				if dep[v] > h {
					h = dep[v]
				}
				stack = append(stack, v)
			}
		}

		cnt := make([]int, h+1)
		for v := 2; v <= n; v++ {
			cnt[dep[v]]++
		}
		start := make([]int, h+2)
		for d := 1; d <= h; d++ {
			start[d+1] = start[d] + cnt[d]
		}
		ord := make([]int, n-1)
		cur := make([]int, h+1)
		copy(cur, start[:h+1])
		for v := 2; v <= n; v++ {
			d := dep[v]
			ord[cur[d]] = v
			cur[d]++
		}

		lg = bits.Len(uint(n))
		up = make([][]int, lg)
		up[0] = parent
		for k := 1; k < lg; k++ {
			arr := make([]int, n+1)
			prev := up[k-1]
			for v := 1; v <= n; v++ {
				arr[v] = prev[prev[v]]
			}
			up[k] = arr
		}

		g := make([]int, h)
		active := false
		a, b, diam := 0, 0, 0

		for d := h; d >= 1; d-- {
			for i := start[d]; i < start[d+1]; i++ {
				u := ord[i]
				if !active {
					active = true
					a, b, diam = u, u, 0
				} else {
					da := dist(u, a)
					db := dist(u, b)
					if da >= db {
						if da > diam {
							b = u
							diam = da
						}
					} else {
						if db > diam {
							a = u
							diam = db
						}
					}
				}
			}
			g[d-1] = diam
		}

		r := 0
		for x := 1; x <= n; x++ {
			for r < h && r-(g[r]+1)/2 < x {
				r++
			}
			ans := h
			if r < h {
				ans = r
			}
			if x > 1 {
				out.WriteByte(' ')
			}
			writeInt(&out, ans)
		}
		out.WriteByte('\n')
	}

	os.Stdout.Write(out.Bytes())
}