← Home
For problem statement at 0-999/0-99/40-49/45/problemF.txt this is a correct solution, but verifier at 0-999/0-99/40-49/45/verifierF.go ends with case 3 wrong answer
expected:
-1
got:
9
input:
4 3
exit status 1 can you fix the verifier? package main

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

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}

func max(a, b int) int {
	if a > b {
		return a
	}
	return b
}

func min3(a, b, c int) int {
	return min(a, min(b, c))
}

func ceil_div2(a int) int {
	if a <= 0 {
		return 0
	}
	return (a + 1) / 2
}

var m, n int
var parent [3][2][100005]int
var visited [3][2][100005]bool

func find(t, b, k int) int {
	if parent[t][b][k] == k {
		return k
	}
	parent[t][b][k] = find(t, b, parent[t][b][k])
	return parent[t][b][k]
}

type TK struct{ t, k int }

func get_types(G, W int) []TK {
	var res []TK
	if G == 0 {
		res = append(res, TK{0, W})
	}
	if G == m {
		res = append(res, TK{2, W})
	}
	if G == W {
		res = append(res, TK{1, W})
	}
	return res
}

type Range struct{ t, L, R int }

func get_b0_transitions(t, k int) []Range {
	var res []Range
	if t == 0 {
		if k >= 1 {
			res = append(res, Range{0, max(0, k-n), k - 1})
		}
	} else if t == 2 {
		if k >= 1 {
			res = append(res, Range{2, max(0, k-n), k - 1})
		}
		L := max(0, ceil_div2(m+k-n))
		R := min(k, (m+k-1)/2)
		if L <= R {
			res = append(res, Range{1, L, R})
		}
		if n >= m {
			max_y := min3(k, n-m, m)
			if max_y >= 0 {
				res = append(res, Range{0, k - max_y, k})
			}
		}
	} else if t == 1 {
		if k >= 1 && n >= 2 {
			res = append(res, Range{1, max(0, k-n/2), k - 1})
		}
		if k >= 1 && n >= k {
			res = append(res, Range{0, max(0, k-(n-k)), k})
		}
	}
	return res
}

func get_GW(t, k int) (int, int) {
	if t == 0 {
		return 0, k
	}
	if t == 1 {
		return k, k
	}
	return m, k
}

func mark_visited(G, W, b int) {
	for _, tk := range get_types(G, W) {
		if !visited[tk.t][b][tk.k] {
			visited[tk.t][b][tk.k] = true
			parent[tk.t][b][tk.k] = find(tk.t, b, tk.k+1)
		}
	}
}

type State struct {
	G, W, b, dist int
}

func solve() {
	reader := bufio.NewReader(os.Stdin)
	fmt.Fscan(reader, &m, &n)

	for t := 0; t < 3; t++ {
		for b := 0; b < 2; b++ {
			for k := 0; k <= m+1; k++ {
				parent[t][b][k] = k
			}
		}
	}

	queue := make([]State, 0, 1000000)
	queue = append(queue, State{m, m, 0, 0})
	mark_visited(m, m, 0)

	for len(queue) > 0 {
		curr := queue[0]
		queue = queue[1:]

		if curr.G == 0 && curr.W == 0 && curr.b == 1 {
			fmt.Println(curr.dist)
			return
		}

		var targets []Range
		if curr.b == 0 {
			for _, tk := range get_types(curr.G, curr.W) {
				targets = append(targets, get_b0_transitions(tk.t, tk.k)...)
			}
		} else {
			G_d := m - curr.G
			W_d := m - curr.W
			for _, tk_d := range get_types(G_d, W_d) {
				targets_d := get_b0_transitions(tk_d.t, tk_d.k)
				for _, r := range targets_d {
					var st int
					if r.t == 0 {
						st = 2
					} else if r.t == 1 {
						st = 1
					} else if r.t == 2 {
						st = 0
					}
					targets = append(targets, Range{st, m-r.R, m-r.L})
				}
			}
		}

		for _, r := range targets {
			k := find(r.t, 1-curr.b, r.L)
			for k <= r.R {
				G_new, W_new := get_GW(r.t, k)
				queue = append(queue, State{G_new, W_new, 1 - curr.b, curr.dist + 1})
				mark_visited(G_new, W_new, 1 - curr.b)
				k = find(r.t, 1-curr.b, k+1)
			}
		}
	}

	fmt.Println("-1")
}

func main() {
	solve()
}