For problem statement at 1000-1999/1700-1799/1760-1769/1766/problemE.txt this is a correct solution, but verifier at 1000-1999/1700-1799/1760-1769/1766/verifierE.go ends with all tests passed can you fix the verifier? package main
import (
"bufio"
"fmt"
"os"
)
type FastScanner struct {
r *bufio.Reader
}
func NewFastScanner() *FastScanner {
return &FastScanner{r: bufio.NewReaderSize(os.Stdin, 1<<20)}
}
func (fs *FastScanner) NextInt() int {
sign := 1
val := 0
c, _ := fs.r.ReadByte()
for (c < '0' || c > '9') && c != '-' {
c, _ = fs.r.ReadByte()
}
if c == '-' {
sign = -1
c, _ = fs.r.ReadByte()
}
for c >= '0' && c <= '9' {
val = val*10 + int(c-'0')
c2, err := fs.r.ReadByte()
if err != nil {
break
}
c = c2
}
return sign * val
}
func main() {
in := NewFastScanner()
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
n := in.NextInt()
a := make([]int, n+1)
for i := 1; i <= n; i++ {
a[i] = in.NextInt()
}
var zeroSum int64 = 0
positions := make([]int, 0, n)
values := make([]int, 0, n)
for i := 1; i <= n; i++ {
if a[i] == 0 {
zeroSum += int64(i) * int64(n-i+1)
} else {
positions = append(positions, i)
values = append(values, a[i])
}
}
m := len(values)
if m == 0 {
fmt.Fprintln(out, zeroSum)
return
}
L := make([]int64, m)
R := make([]int64, m)
for i := 0; i < m; i++ {
prev := 0
if i > 0 {
prev = positions[i-1]
}
L[i] = int64(positions[i] - prev)
R[i] = int64(n - positions[i] + 1)
}
var dist [16]int64
var sumG int64 = 0
for i := 0; i < m; i++ {
x := values[i]
Lt := L[i]
Rt := R[i]
var W int64
if x == 1 {
// all2 states: F==2, U==0 (V can be 0 or 1) -> ids 2 and 10
weightAll2 := dist[2] + dist[10]
W = Lt + weightAll2
} else if x == 2 {
// all1 states: F==1, V==0 (U can be 0 or 1) -> ids 1 and 5
weightAll1 := dist[1] + dist[5]
W = Lt + weightAll1
} else { // x == 3
W = Lt
}
sumG += W * Rt
var nd [16]int64
for s := 0; s < 16; s++ {
w := dist[s]
if w == 0 {
continue
}
F := s & 3
U := (s >> 2) & 1
V := (s >> 3) & 1
nF, nU, nV := F, U, V
if F == 0 {
nF = x
nU = 0
nV = 0
} else {
if x == 3 {
nF = 3
} else if x == 1 {
if F == 1 || F == 3 {
nF = 1
} else { // F == 2
if U == 0 {
nU = 1
}
}
} else if x == 2 {
if F == 2 || F == 3 {
nF = 2
} else { // F == 1
if V == 0 {
nV = 1
}
}
}
}
id := nF | (nU << 2) | (nV << 3)
nd[id] += w
}
// add new start s=i (empty -> consume x)
id := x // from empty: F=x, U=V=0
nd[id] += Lt
dist = nd
}
ans := zeroSum + sumG
fmt.Fprintln(out, ans)
}