← Home
For problem statement at 1000-1999/1300-1399/1300-1309/1307/problemE.txt this is a correct solution, but verifier at 1000-1999/1300-1399/1300-1309/1307/verifierE.go ends with case 16 failed: expected 2 1 got 1 5
input:
2 6
2 2
1 1
2 1
2 2
1 2
2 1
1 2
exit status 1 can you fix the verifier? package main

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

type Cow struct {
	id   int
	h    int
	Lpos int
	Rpos int
}

func main() {
	reader := bufio.NewReader(os.Stdin)
	var n, m int
	if _, err := fmt.Fscan(reader, &n, &m); err != nil {
		return
	}

	S := make([]int, n+1)
	I := make([][]int, n+1)
	for i := 1; i <= n; i++ {
		fmt.Fscan(reader, &S[i])
		I[S[i]] = append(I[S[i]], i)
	}

	cowsByType := make([][]Cow, n+1)
	cowHAtPos := make([]int, n+1)

	for i := 1; i <= m; i++ {
		var f, h int
		fmt.Fscan(reader, &f, &h)
		k_c := len(I[f])
		if h <= k_c {
			Lpos := I[f][h-1]
			Rpos := I[f][k_c-h]
			cow := Cow{id: i, h: h, Lpos: Lpos, Rpos: Rpos}
			cowsByType[f] = append(cowsByType[f], cow)
			cowHAtPos[Lpos] = h
		}
	}

	activeTypes := make([]int, 0)
	for c := 1; c <= n; c++ {
		if len(cowsByType[c]) > 0 {
			activeTypes = append(activeTypes, c)
		}
	}

	var global_max int = -1
	var global_ways int64 = 0
	MOD := int64(1000000007)

	for M := 0; M <= n; M++ {
		if M > 0 {
			if cowHAtPos[M] == 0 {
				continue
			}
		}

		cur_max := 0
		var cur_ways int64 = 1

		c_M := 0
		if M > 0 {
			c_M = S[M]
		}

		for _, c := range activeTypes {
			max_c := 0
			var ways_c int64 = 0

			if M > 0 && c == c_M {
				targetH := cowHAtPos[M]
				cntR := int64(0)
				for _, cow := range cowsByType[c] {
					if cow.Rpos > M && cow.h != targetH {
						cntR++
					}
				}
				if cntR > 0 {
					max_c = 2
					ways_c = cntR
				} else {
					max_c = 1
					ways_c = 1
				}
			} else {
				cntL, cntR, cntBoth := int64(0), int64(0), int64(0)
				for _, cow := range cowsByType[c] {
					inL := cow.Lpos < M
					inR := cow.Rpos > M
					if inL {
						cntL++
					}
					if inR {
						cntR++
					}
					if inL && inR {
						cntBoth++
					}
				}

				W2 := cntL*cntR - cntBoth
				if W2 > 0 {
					max_c = 2
					ways_c = W2
				} else if cntL+cntR > 0 {
					max_c = 1
					ways_c = cntL + cntR
				} else {
					max_c = 0
					ways_c = 1
				}
			}

			cur_max += max_c
			cur_ways = (cur_ways * ways_c) % MOD
		}

		if cur_max > global_max {
			global_max = cur_max
			global_ways = cur_ways
		} else if cur_max == global_max {
			global_ways = (global_ways + cur_ways) % MOD
		}
	}

	fmt.Printf("%d %d\n", global_max, global_ways)
}