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