← Home
For problem statement at 1000-1999/1900-1999/1900-1909/1903/problemF.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1900-1909/1903/verifierF.go ends with all tests passed can you fix the verifier? package main

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

func readInt(in *bufio.Reader) int {
	var x int
	var c byte
	var err error
	for {
		c, err = in.ReadByte()
		if err != nil || (c >= '0' && c <= '9') {
			break
		}
	}
	if err != nil {
		return 0
	}
	x = int(c - '0')
	for {
		c, err = in.ReadByte()
		if err != nil || c < '0' || c > '9' {
			break
		}
		x = x*10 + int(c-'0')
	}
	return x
}

const MAXV = 600005

var adj = make([][]int32, MAXV)
var dfn = make([]int32, MAXV)
var low = make([]int32, MAXV)
var scc = make([]int32, MAXV)
var inStack = make([]bool, MAXV)
var stack = make([]int32, 0, MAXV)

func solve(in *bufio.Reader, out *bufio.Writer) {
	n := readInt(in)
	m := readInt(in)

	edges := make([][2]int, m)
	for i := 0; i < m; i++ {
		edges[i][0] = readInt(in) - 1
		edges[i][1] = readInt(in) - 1
	}

	V := 6 * n

	POS := func(v int) int32 { return int32(2 * v) }
	NEG := func(v int) int32 { return int32(2*v + 1) }

	addImpl := func(u, v int32) {
		adj[u] = append(adj[u], v)
		adj[v^1] = append(adj[v^1], u^1)
	}

	check := func(d int) bool {
		if d == 1 {
			return true
		}
		for i := 0; i < V; i++ {
			if adj[i] == nil {
				adj[i] = make([]int32, 0, 4)
			} else {
				adj[i] = adj[i][:0]
			}
			dfn[i] = 0
			inStack[i] = false
		}
		stack = stack[:0]
		timer := int32(0)
		sccCount := int32(0)

		for _, e := range edges {
			addImpl(NEG(e[0]), POS(e[1]))
		}

		B := d - 1
		for c := 0; c*B < n; c++ {
			L := c * B
			R := (c+1)*B - 1
			if R >= n {
				R = n - 1
			}
			for i := L; i <= R; i++ {
				xi := i
				pi := n + i
				si := 2*n + i

				addImpl(POS(xi), POS(pi))
				if i > L {
					pim1 := n + i - 1
					addImpl(POS(pim1), POS(pi))
					addImpl(POS(xi), NEG(pim1))
				}

				addImpl(POS(xi), POS(si))
				if i < R {
					sip1 := 2*n + i + 1
					addImpl(POS(sip1), POS(si))
					addImpl(POS(xi), NEG(sip1))
				}

				if R < n-1 {
					j := i + d - 1
					if j > n-1 {
						j = n - 1
					}
					pj := n + j
					addImpl(POS(xi), NEG(pj))
				}
			}
		}

		var dfs func(int32)
		dfs = func(u int32) {
			timer++
			dfn[u] = timer
			low[u] = timer
			stack = append(stack, u)
			inStack[u] = true

			for _, v := range adj[u] {
				if dfn[v] == 0 {
					dfs(v)
					if low[v] < low[u] {
						low[u] = low[v]
					}
				} else if inStack[v] {
					if dfn[v] < low[u] {
						low[u] = dfn[v]
					}
				}
			}

			if low[u] == dfn[u] {
				sccCount++
				for {
					v := stack[len(stack)-1]
					stack = stack[:len(stack)-1]
					inStack[v] = false
					scc[v] = sccCount
					if u == v {
						break
					}
				}
			}
		}

		for i := int32(0); i < int32(V); i++ {
			if dfn[i] == 0 {
				dfs(i)
			}
		}

		for i := int32(0); i < int32(V); i += 2 {
			if scc[i] == scc[i+1] {
				return false
			}
		}
		return true
	}

	ans := 1
	lowB, highB := 1, n
	for lowB <= highB {
		mid := (lowB + highB) / 2
		if check(mid) {
			ans = mid
			lowB = mid + 1
		} else {
			highB = mid - 1
		}
	}
	fmt.Fprintln(out, ans)
}

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

	t := readInt(in)
	for i := 0; i < t; i++ {
		solve(in, out)
	}
}