← Home
For problem statement at 1000-1999/1300-1399/1370-1379/1379/problemE.txt this is a correct solution, but verifier at 1000-1999/1300-1399/1370-1379/1379/verifierE.go ends with case 21 failed: expected "NO" got "YES\n9 4 4 8 7 7 8 9 0"
input:
9 1
exit status 1 can you fix the verifier? package main

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

var s []int

func isValid(n, k int) bool {
	if n%2 == 0 {
		return false
	}
	if n == 1 || n == 3 {
		return k == 0
	}
	maxK := (n - 3) / 2
	if k < 0 || k > maxK {
		return false
	}
	isPerf := (n & (n + 1)) == 0
	if isPerf && k == 1 {
		return false
	}
	if !isPerf && k == 0 {
		return false
	}
	return true
}

func build(n, k, offset int) int {
	root := offset + n
	if n == 1 {
		return root
	}

	for a := 1; a <= n-2; a += 2 {
		b := n - 1 - a
		imb := 0
		if a >= 2*b || b >= 2*a {
			imb = 1
		}

		rem := k - imb
		if rem < 0 {
			continue
		}

		minA := 1
		if a == 1 || a == 3 || (a&(a+1)) == 0 {
			minA = 0
		}
		maxA := 0
		if a > 3 {
			maxA = (a - 3) / 2
		}

		minB := 1
		if b == 1 || b == 3 || (b&(b+1)) == 0 {
			minB = 0
		}
		maxB := 0
		if b > 3 {
			maxB = (b - 3) / 2
		}

		startKA := minA
		if rem-maxB > startKA {
			startKA = rem - maxB
		}
		endKA := maxA
		if rem-minB < endKA {
			endKA = rem - minB
		}

		found := false
		for kA := startKA; kA <= endKA; kA++ {
			kB := rem - kA
			if isValid(a, kA) && isValid(b, kB) {
				rootA := build(a, kA, offset)
				rootB := build(b, kB, offset+a)
				s[rootA] = root
				s[rootB] = root
				found = true
				break
			}
		}
		if found {
			return root
		}
	}
	return root
}

func main() {
	in := bufio.NewReader(os.Stdin)
	out := bufio.NewWriter(os.Stdout)
	defer out.Flush()

	var n, k int
	if _, err := fmt.Fscan(in, &n, &k); err != nil {
		return
	}

	if !isValid(n, k) {
		fmt.Fprintln(out, "NO")
		return
	}

	s = make([]int, n+1)
	build(n, k, 0)

	fmt.Fprintln(out, "YES")
	for i := 1; i <= n; i++ {
		if i > 1 {
			fmt.Fprint(out, " ")
		}
		fmt.Fprint(out, s[i])
	}
	fmt.Fprintln(out)
}