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