← Home
For problem statement at 1000-1999/1800-1899/1880-1889/1889/problemC2.txt this is a correct solution, but verifier at 1000-1999/1800-1899/1880-1889/1889/verifierC2.go ends with case 2 failed: expected 5 got 6
input:
1
6 1 1
3 3
exit status 1 can you fix the verifier? ```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"sort"
	"strconv"
	"strings"
	"math/bits"
)

func max(a, b int64) int64 {
	if a > b {
		return a
	}
	return b
}

func main() {
	in := bufio.NewReader(os.Stdin)
	var t int
	fmt.Fscan(in, &t)
	for cas := 0; cas < t; cas++ {
		var n, m, k int
		fmt.Fscan(in, &n, &m, &k)
		type Interval struct {
			l, r int
		}
		intervals := make([]Interval, m)
		for i := 0; i < m; i++ {
			fmt.Fscan(in, &intervals[i].l, &intervals[i].r)
		}
		type Event struct {
			pos     int
			id      int
			isStart bool
		}
		events := []Event{}
		for i := 0; i < m; i++ {
			events = append(events, Event{intervals[i].l, i, true})
			if intervals[i].r+1 <= n+1 {
				events = append(events, Event{intervals[i].r + 1, i, false})
			}
		}
		sort.Slice(events, func(i, j int) bool {
			if events[i].pos != events[j].pos {
				return events[i].pos < events[j].pos
			}
			return !events[i].isStart && events[j].isStart
		})
		active := make(map[int]struct{})
		current_pos := 1
		mp := make(map[string]int64)
		ei := 0
		for ; ei < len(events); {
			next_pos := events[ei].pos
			len1 := next_pos - current_pos
			if len1 > 0 {
				count := len(active)
				if count <= k {
					v := []int{}
					for id1 := range active {
						v = append(v, id1)
					}
					sort.Ints(v)
					var sb strings.Builder
					for j, x := range v {
						if j > 0 {
							sb.WriteString(",")
						}
						sb.WriteString(strconv.Itoa(x))
					}
					key := sb.String()
					mp[key] += int64(len1)
				}
			}
			current_pos = next_pos
			for ; ei < len(events) && events[ei].pos == current_pos; ei++ {
				e := events[ei]
				if e.isStart {
					active[e.id] = struct{}{}
				} else {
					delete(active, e.id)
				}
			}
		}
		len1 := n - current_pos + 1
		if len1 > 0 {
			count := len(active)
			if count <= k {
				v := []int{}
				for id1 := range active {
					v = append(v, id1)
				}
				sort.Ints(v)
				var sb strings.Builder
				for j, x := range v {
					if j > 0 {
						sb.WriteString(",")
					}
					sb.WriteString(strconv.Itoa(x))
				}
				key := sb.String()
				mp[key] += int64(len1)
			}
		}
		w_empty := mp[""]
		sets := [][]int{}
		ww := []int64{}
		for key, val := range mp {
			if key == "" {
				continue
			}
			strs := strings.Split(key, ",")
			v := []int{}
			for _, s := range strs {
				x, _ := strconv.Atoi(s)
				v = append(v, x)
			}
			sets = append(sets, v)
			ww = append(ww, val)
		}
		daySet := make(map[int]struct{})
		for _, v := range sets {
			for _, x := range v {
				daySet[x] = struct{}{}
			}
		}
		alldays := []int{}
		for d := range daySet {
			alldays = append(alldays, d)
		}
		sort.Ints(alldays)
		r := len(alldays)
		idm := make(map[int]int)
		for j := 0; j < r; j++ {
			idm[alldays[j]] = j
		}
		setMasks := []int{}
		for _, v := range sets {
			mask := 0
			for _, x := range v {
				mask |= (1 << idm[x])
			}
			setMasks = append(setMasks, mask)
		}
		adj := make([][]int, r)
		for q := 0; q < len(sets); q++ {
			v := sets[q]
			for a := 0; a < len(v); a++ {
				for b := a + 1; b < len(v); b++ {
					u := idm[v[a]]
					vv := idm[v[b]]
					adj[u] = append(adj[u], vv)
					adj[vv] = append(adj[vv], u)
				}
			}
		}
		visited := make([]bool, r)
		components := [][]int{}
		for i := 0; i < r; i++ {
			if !visited[i] {
				comp := []int{}
				stack := []int{i}
				visited[i] = true
				for len(stack) > 0 {
					cur := stack[len(stack)-1]
					stack = stack[:len(stack)-1]
					comp = append(comp, cur)
					for _, to := range adj[cur] {
						if !visited[to] {
							visited[to] = true
							stack = append(stack, to)
						}
					}
				}
				components = append(components, comp)
			}
		}
		dpm := make([]int64, k+1)
		for j := 0; j <= k; j++ {
			dpm[j] = 0
		}
		for _, comp := range components {
			s := len(comp)
			localId := make([]int, r)
			for j := 0; j < r; j++ {
				localId[j] = -1
			}
			for j := 0; j < s; j++ {
				localId[comp[j]] = j
			}
			localContrib := make([]int64, 1<<uint(s))
			for q := 0; q < len(sets); q++ {
				ok := true
				lmask := 0
				for _, x := range sets[q] {
					lid := localId[idm[x]]
					if lid == -1 {
						ok = false
						break
					}
					lmask |= (1 << uint(lid))
				}
				if ok {
					localContrib[lmask] += ww[q]
				}
			}
			for bit := 0; bit < s; bit++ {
				for mask := 0; mask < (1<<uint(s)); mask++ {
					if (mask & (1 << uint(bit))) != 0 {
						localContrib[mask] += localContrib[mask^(1<<uint(bit))]
					}
				}
			}
			localMax := make([]int64, s+1)
			for mask := 0; mask < (1<<uint(s)); mask++ {
				pop := bits.OnesCount(uint(mask))
				localMax[pop] = max(localMax[pop], localContrib[mask])
			}
			newDp := make([]int64, k+1)
			copy(newDp, dpm)
			for j := 0; j <= k; j++ {
				for c := 0; c <= s && j+c <= k; c++ {
					newDp[j+c] = max(newDp[j+c], dpm[j]+localMax[c])
				}
			}
			dpm = newDp
		}
		var maxAdd int64 = 0
		for j := 0; j <= k; j++ {
			maxAdd = max(maxAdd, dpm[j])
		}
		ans := w_empty + maxAdd
		fmt.Println(ans)
	}
}
```