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)
}
}