← Home
For problem statement at 1000-1999/1300-1399/1370-1379/1379/problemD.txt this is a correct solution, but verifier at 1000-1999/1300-1399/1370-1379/1379/verifierD.go ends with case 2 failed: expected "0 8" got "0 5"
input:
1 1 20 7
0 8
exit status 1 can you fix the verifier? package main

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

type Event struct {
	t   int
	val int
}

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

	H := m / 2
	x := make([]int, n)

	events := make([]Event, 0, 2*n+1)
	events = append(events, Event{0, 0})

	for i := 0; i < n; i++ {
		var hi, mi int
		fmt.Fscan(reader, &hi, &mi)
		xi := mi % H
		x[i] = xi

		if k == 1 {
			continue
		}

		if xi+1 < H {
			if xi+k <= H {
				events = append(events, Event{xi + 1, 1})
				events = append(events, Event{xi + k, -1})
			} else {
				events = append(events, Event{xi + 1, 1})
				events = append(events, Event{0, 1})
				events = append(events, Event{xi + k - H, -1})
			}
		} else {
			events = append(events, Event{0, 1})
			events = append(events, Event{k - 1, -1})
		}
	}

	sort.Slice(events, func(i, j int) bool {
		return events[i].t < events[j].t
	})

	var merged []Event
	for _, e := range events {
		if e.t >= H {
			continue
		}
		if len(merged) > 0 && merged[len(merged)-1].t == e.t {
			merged[len(merged)-1].val += e.val
		} else {
			merged = append(merged, e)
		}
	}

	minCanceled := n + 1
	optT := 0
	curr := 0

	for _, e := range merged {
		curr += e.val
		if curr < minCanceled {
			minCanceled = curr
			optT = e.t
		}
	}

	if minCanceled == n+1 {
		minCanceled = 0
	}

	fmt.Println(minCanceled, optT)

	if minCanceled > 0 {
		var canceled []int
		for i := 0; i < n; i++ {
			xi := x[i]
			if k == 1 {
				continue
			}
			start := (xi + 1) % H
			end := (xi + k - 1) % H
			isCanceled := false
			if start <= end {
				isCanceled = (optT >= start && optT <= end)
			} else {
				isCanceled = (optT >= start || optT <= end)
			}
			if isCanceled {
				canceled = append(canceled, i+1)
			}
		}
		for i, idx := range canceled {
			if i > 0 {
				fmt.Print(" ")
			}
			fmt.Print(idx)
		}
		fmt.Println()
	} else {
		fmt.Println()
	}
}