← Home
For problem statement at 2000-2999/2000-2099/2000-2009/2003/problemE2.txt this is a correct solution, but verifier at 2000-2999/2000-2099/2000-2009/2003/verifierE2.go ends with All 9 tests passed can you fix the verifier? package main

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

type FastScanner struct {
	data []byte
	idx  int
	n    int
}

func NewFastScanner() *FastScanner {
	data, _ := io.ReadAll(os.Stdin)
	return &FastScanner{data: data, n: len(data)}
}

func (fs *FastScanner) NextInt() int {
	for fs.idx < fs.n && (fs.data[fs.idx] < '0' || fs.data[fs.idx] > '9') {
		fs.idx++
	}
	val := 0
	for fs.idx < fs.n && fs.data[fs.idx] >= '0' && fs.data[fs.idx] <= '9' {
		val = val*10 + int(fs.data[fs.idx]-'0')
		fs.idx++
	}
	return val
}

type Interval struct {
	l, r int
}

type Comp struct {
	L, R int
	a, b int
}

func main() {
	in := NewFastScanner()
	out := bufio.NewWriterSize(os.Stdout, 1<<20)
	defer out.Flush()

	t := in.NextInt()
	const INF int64 = 1 << 60

	for ; t > 0; t-- {
		n := in.NextInt()
		m := in.NextInt()

		intervals := make([]Interval, m)
		diff := make([]int, n+2)

		for i := 0; i < m; i++ {
			l := in.NextInt()
			r := in.NextInt()
			intervals[i] = Interval{l, r}
			diff[l]++
			diff[r]--
		}

		covered := make([]bool, n)
		cur := 0
		for i := 1; i <= n-1; i++ {
			cur += diff[i]
			covered[i] = cur > 0
		}

		compID := make([]int, n+1)
		comps := make([]Comp, 0)
		L := 1
		for i := 1; i <= n-1; i++ {
			if !covered[i] {
				id := len(comps)
				comps = append(comps, Comp{L: L, R: i, a: 0, b: i - L + 1})
				for p := L; p <= i; p++ {
					compID[p] = id
				}
				L = i + 1
			}
		}
		id := len(comps)
		comps = append(comps, Comp{L: L, R: n, a: 0, b: n - L + 1})
		for p := L; p <= n; p++ {
			compID[p] = id
		}

		ok := true
		for _, it := range intervals {
			id := compID[it.l]
			c := &comps[id]
			low := it.l - c.L + 1
			high := it.r - c.L
			if low > c.a {
				c.a = low
			}
			if high < c.b {
				c.b = high
			}
		}

		for i := range comps {
			if comps[i].a > comps[i].b {
				ok = false
				break
			}
		}

		if !ok {
			fmt.Fprintln(out, -1)
			continue
		}

		prev := make([]int64, n+1)
		for i := range prev {
			prev[i] = INF
		}
		prev[0] = 0
		minOnes, maxOnes := 0, 0

		for _, c := range comps {
			length := c.R - c.L + 1
			next := make([]int64, n+1)
			for i := range next {
				next[i] = INF
			}
			newMin := minOnes + c.a
			newMax := maxOnes + c.b

			for o := minOnes; o <= maxOnes; o++ {
				if prev[o] == INF {
					continue
				}
				base := prev[o]
				for x := c.a; x <= c.b; x++ {
					s := o + x
					cost := base + int64(o+x)*int64(length-x)
					if cost < next[s] {
						next[s] = cost
					}
				}
			}

			prev = next
			minOnes, maxOnes = newMin, newMax
		}

		minBad := INF
		for i := minOnes; i <= maxOnes; i++ {
			if prev[i] < minBad {
				minBad = prev[i]
			}
		}

		if minBad == INF {
			fmt.Fprintln(out, -1)
			continue
		}

		ans := int64(n) * int64(n-1) / 2
		ans -= minBad
		fmt.Fprintln(out, ans)
	}
}