← Home
For problem statement at 1000-1999/1900-1999/1990-1999/1995/problemE1.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1990-1999/1995/verifierE1.go ends with All 100 tests passed can you fix the verifier? ```go
package main

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

func desk_sum(k, state_u, state_v, N int, A []int) int {
	p1 := 2*k - 1
	p2 := 2*k

	val1 := 0
	if p1 <= N {
		if state_u == 0 {
			val1 = A[p1]
		} else {
			val1 = A[p1+N]
		}
	} else {
		if state_u == 0 {
			val1 = A[p1]
		} else {
			val1 = A[p1-N]
		}
	}

	val2 := 0
	if p2 <= N {
		if state_v == 0 {
			val2 = A[p2]
		} else {
			val2 = A[p2+N]
		}
	} else {
		if state_v == 0 {
			val2 = A[p2]
		} else {
			val2 = A[p2-N]
		}
	}

	return val1 + val2
}

func eval_sum(k, state_curr, state_nxt, curr_var, nxt_var, N int, A, U, V []int) int {
	u := U[k]
	v := V[k]
	var state_u, state_v int
	if curr_var == u && nxt_var == v {
		state_u = state_curr
		state_v = state_nxt
	} else {
		state_u = state_nxt
		state_v = state_curr
	}
	return desk_sum(k, state_u, state_v, N, A)
}

func check_cycle(cv, ce []int, min_s, max_s, N int, A, U, V []int) bool {
	L := len(cv)
	for start_state := 0; start_state <= 1; start_state++ {
		reach := []int{start_state}
		for j := 0; j < L-1; j++ {
			var next_reach []int
			for _, curr_state := range reach {
				for nxt_state := 0; nxt_state <= 1; nxt_state++ {
					s := eval_sum(ce[j], curr_state, nxt_state, cv[j], cv[j+1], N, A, U, V)
					if min_s <= s && s <= max_s {
						found := false
						for _, x := range next_reach {
							if x == nxt_state {
								found = true
								break
							}
						}
						if !found {
							next_reach = append(next_reach, nxt_state)
						}
					}
				}
			}
			reach = next_reach
		}
		for _, curr_state := range reach {
			s := eval_sum(ce[L-1], curr_state, start_state, cv[L-1], cv[0], N, A, U, V)
			if min_s <= s && s <= max_s {
				return true
			}
		}
	}
	return false
}

func check_all(cvs, ces [][]int, min_s, max_s, N int, A, U, V []int) bool {
	for i := 0; i < len(cvs); i++ {
		if !check_cycle(cvs[i], ces[i], min_s, max_s, N, A, U, V) {
			return false
		}
	}
	return true
}

type Edge struct {
	to  int
	idx int
}

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

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

	for i := 0; i < t; i++ {
		var N int
		fmt.Fscan(in, &N)

		A := make([]int, 2*N+1)
		for j := 1; j <= 2*N; j++ {
			fmt.Fscan(in, &A[j])
		}

		adj := make([][]Edge, N+1)
		U := make([]int, N+1)
		V := make([]int, N+1)

		for k := 1; k <= N; k++ {
			p1 := 2*k - 1
			p2 := 2*k

			u := p1
			if p1 > N {
				u = p1 - N
			}
			v := p2
			if p2 > N {
				v = p2 - N
			}

			U[k] = u
			V[k] = v
			adj[u] = append(adj[u], Edge{v, k})
			adj[v] = append(adj[v], Edge{u, k})
		}

		var cycles_v [][]int
		var cycles_e [][]int
		visited_edges := make([]bool, N+1)
		visited_verts := make([]bool, N+1)

		for i := 1; i <= N; i++ {
			if visited_verts[i] {
				continue
			}
			curr := i
			var cv []int
			var ce []int
			for {
				cv = append(cv, curr)
				visited_verts[curr] = true
				moved := false
				for _, edge := range adj[curr] {
					if !visited_edges[edge.idx] {
						visited_edges[edge.idx] = true
						ce = append(ce, edge.idx)
						curr = edge.to
						moved = true
						break
					}
				}
				if !moved {
					break
				}
			}
			if len(cv) > 1 {
				cv = cv[:len(cv)-1]
			}
			cycles_v = append(cycles_v, cv)
			cycles_e = append(cycles_e, ce)
		}

		var all_sums []int
		for k := 1; k <= N; k++ {
			for su := 0; su <= 1; su++ {
				for sv := 0; sv <= 1; sv++ {
					all_sums = append(all_sums, desk_sum(k, su, sv, N, A))
				}
			}
		}

		sort.Ints(all_sums)
		var sorted_sums []int
		for j, s := range all_sums {
			if j == 0 || s != all_sums[j-1] {
				sorted_sums = append(sorted_sums, s)
			}
		}

		ans := -1
		ptr := 0
		for j := 0; j < len(sorted_sums); j++ {
			m := sorted_sums[j]
			if ptr < j {
				ptr = j
			}
			for ptr < len(sorted_sums) && !check_all(cycles_v, cycles_e, m, sorted_sums[ptr], N, A, U, V) {
				ptr++
			}
			if ptr < len(sorted_sums) {
				if ans == -1 || sorted_sums[ptr]-m < ans {
					ans = sorted_sums[ptr] - m
				}
			} else {
				break
			}
		}

		fmt.Fprintln(out, ans)
	}
}
```