For problem statement at 1000-1999/1900-1999/1900-1909/1909/problemC.txt this is a correct solution, but verifier at 1000-1999/1900-1999/1900-1909/1909/verifierC.go ends with case 2 failed: expected 1436 got 1502
input:
1
4
8 24 46 37
22 36 52 51
3 25 69 58
exit status 1 can you fix the verifier? package main
import (
"bufio"
"fmt"
"os"
"sort"
)
type Fenwick struct {
n int
bit []int64
}
func NewFenwick(n int) *Fenwick {
return &Fenwick{n: n, bit: make([]int64, n+1)}
}
func (f *Fenwick) Add(i int, delta int64) {
for i <= f.n {
f.bit[i] += delta
i += i & -i
}
}
func (f *Fenwick) Sum(i int) int64 {
var res int64
for i > 0 {
res += f.bit[i]
i -= i & -i
}
return res
}
func (f *Fenwick) RangeSum(l, r int) int64 {
if r < l {
return 0
}
return f.Sum(r) - f.Sum(l-1)
}
func lowerBound(a []int, x int) int {
l, r := 0, len(a)
for l < r {
m := (l + r) >> 1
if a[m] < x {
l = m + 1
} else {
r = m
}
}
return l
}
func main() {
in := bufio.NewReaderSize(os.Stdin, 1<<20)
out := bufio.NewWriterSize(os.Stdout, 1<<20)
defer out.Flush()
var t int
fmt.Fscan(in, &t)
for ; t > 0; t-- {
var n int
fmt.Fscan(in, &n)
l := make([]int, n)
r := make([]int, n)
c := make([]int64, n)
all := make([]int, 0, 2*n)
for i := 0; i < n; i++ {
fmt.Fscan(in, &l[i])
all = append(all, l[i])
}
for i := 0; i < n; i++ {
fmt.Fscan(in, &r[i])
all = append(all, r[i])
}
for i := 0; i < n; i++ {
fmt.Fscan(in, &c[i])
}
sort.Ints(all)
m := len(all)
minSide := make([]int, 0, n)
maxSide := make([]int, 0, n)
for i := 0; i < n; i++ {
li := l[i]
ri := r[i]
if li < ri {
minSide = append(minSide, li)
maxSide = append(maxSide, ri)
} else {
minSide = append(minSide, ri)
maxSide = append(maxSide, li)
}
}
sort.Ints(minSide)
sort.Ints(maxSide)
fwCnt := NewFenwick(m)
fwSum := NewFenwick(m)
for _, v := range maxSide {
idx := lowerBound(all, v) + 1
fwCnt.Add(idx, 1)
fwSum.Add(idx, int64(v))
}
lengths := make([]int64, n)
for i := 0; i < n; i++ {
x := minSide[i]
idxX := lowerBound(all, x) + 1
totalCnt := fwCnt.Sum(m)
preCnt := fwCnt.Sum(idxX)
var y int
if preCnt == totalCnt {
y = maxSide[i]
} else {
k := preCnt + 1
lb, rb := 1, m
for lb < rb {
md := (lb + rb) >> 1
if fwCnt.Sum(md) >= k {
rb = md
} else {
lb = md + 1
}
}
y = all[lb-1]
}
idxY := lowerBound(all, y) + 1
fwCnt.Add(idxY, -1)
fwSum.Add(idxY, -int64(y))
lengths[i] = int64(y - x)
}
sort.Slice(lengths, func(i, j int) bool { return lengths[i] < lengths[j] })
sort.Slice(c, func(i, j int) bool { return c[i] > c[j] })
var ans int64
for i := 0; i < n; i++ {
ans += lengths[i] * c[i]
}
fmt.Fprintln(out, ans)
}
}