← Home
For problem statement at 2000-2999/2100-2199/2110-2119/2117/problemE.txt this is a correct solution, but verifier at 2000-2999/2100-2199/2110-2119/2117/verifierE.go ends with wrong answer on test 1
input:
1
2
1 1
2 2

expected:
2
got:
1
exit status 1 can you fix the verifier? package main

import (
	"bytes"
	"io"
	"os"
	"strconv"
)

type FastScanner struct {
	data []byte
	idx  int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data}
}

func (fs *FastScanner) NextInt() int {
	n := len(fs.data)
	for fs.idx < n && (fs.data[fs.idx] < '0' || fs.data[fs.idx] > '9') {
		fs.idx++
	}
	val := 0
	for fs.idx < n && fs.data[fs.idx] >= '0' && fs.data[fs.idx] <= '9' {
		val = val*10 + int(fs.data[fs.idx]-'0')
		fs.idx++
	}
	return val
}

func solveCase(n int, a, b []int) int {
	x := make([]int, n+1)
	y := make([]int, n+1)
	occX := make([][]int, n+1)
	occY := make([][]int, n+1)

	for i := 1; i <= n; i++ {
		if i&1 == 1 {
			x[i] = a[i]
			y[i] = b[i]
		} else {
			x[i] = b[i]
			y[i] = a[i]
		}
		occX[x[i]] = append(occX[x[i]], i)
		occY[y[i]] = append(occY[y[i]], i)
	}

	ans := 0
	for v := 1; v <= n; v++ {
		lx, ly := 0, 0
		if len(occX[v]) > 0 {
			lx = occX[v][len(occX[v])-1]
		}
		if len(occY[v]) > 0 {
			ly = occY[v][len(occY[v])-1]
		}
		if lx < ly {
			if lx > ans {
				ans = lx
			}
		} else {
			if ly > ans {
				ans = ly
			}
		}
	}

	px := make([]int, n+1)
	py := make([]int, n+1)
	ptrX := make([]int, n+1)
	ptrY := make([]int, n+1)

	size := 1
	for size < n {
		size <<= 1
	}
	seg := make([]int, size<<1)

	calc := func(v int) int {
		sx, sy := 0, 0
		if ptrX[v] >= 0 {
			sx = occX[v][ptrX[v]]
		}
		if ptrY[v] >= 0 {
			sy = occY[v][ptrY[v]]
		}
		lx := px[v]
		if sy > 0 {
			t := sy - 1
			if t > lx {
				lx = t
			}
		}
		ly := py[v]
		if sx > 0 {
			t := sx - 1
			if t > ly {
				ly = t
			}
		}
		if lx < ly {
			return lx
		}
		return ly
	}

	update := func(v int) {
		p := size + v - 1
		seg[p] = calc(v)
		for p >>= 1; p > 0; p >>= 1 {
			if seg[p<<1] >= seg[p<<1|1] {
				seg[p] = seg[p<<1]
			} else {
				seg[p] = seg[p<<1|1]
			}
		}
	}

	for v := 1; v <= n; v++ {
		ptrX[v] = len(occX[v]) - 1
		for ptrX[v] >= 0 && occX[v][ptrX[v]] <= 1 {
			ptrX[v]--
		}
		ptrY[v] = len(occY[v]) - 1
		for ptrY[v] >= 0 && occY[v][ptrY[v]] <= 1 {
			ptrY[v]--
		}
		seg[size+v-1] = calc(v)
	}
	for i := size - 1; i >= 1; i-- {
		if seg[i<<1] >= seg[i<<1|1] {
			seg[i] = seg[i<<1]
		} else {
			seg[i] = seg[i<<1|1]
		}
	}

	if seg[1] > ans {
		ans = seg[1]
	}

	for r := 1; r < n; r++ {
		v := x[r]
		px[v] = r
		update(v)

		v = y[r]
		py[v] = r
		update(v)

		v = x[r+1]
		for ptrX[v] >= 0 && occX[v][ptrX[v]] <= r+1 {
			ptrX[v]--
		}
		update(v)

		v = y[r+1]
		for ptrY[v] >= 0 && occY[v][ptrY[v]] <= r+1 {
			ptrY[v]--
		}
		update(v)

		if seg[1] > ans {
			ans = seg[1]
		}
	}

	return ans
}

func main() {
	fs := NewFastScanner()
	t := fs.NextInt()
	var out bytes.Buffer
	for ; t > 0; t-- {
		n := fs.NextInt()
		a := make([]int, n+1)
		b := make([]int, n+1)
		for i := 1; i <= n; i++ {
			a[i] = fs.NextInt()
		}
		for i := 1; i <= n; i++ {
			b[i] = fs.NextInt()
		}
		ans := solveCase(n, a, b)
		out.WriteString(strconv.Itoa(ans))
		out.WriteByte('\n')
	}
	_, _ = os.Stdout.Write(out.Bytes())
}