← Home
For problem statement at 1000-1999/1200-1299/1280-1289/1286/problemD.txt this is a correct solution, but verifier at 1000-1999/1200-1299/1280-1289/1286/verifierD.go ends with case 11 failed: expected 569888156 got 240467521
input:
6
4 4 30
6 5 39
7 3 86
8 5 15
10 4 6
12 4 15
exit status 1 can you fix the verifier? package main

import (
	"fmt"
	"io"
	"os"
	"sort"
)

const MOD int64 = 998244353

type Mat struct {
	a00, a01, a10, a11 int64
}

func mul(x, y Mat) Mat {
	return Mat{
		(x.a00*y.a00 + x.a01*y.a10) % MOD,
		(x.a00*y.a01 + x.a01*y.a11) % MOD,
		(x.a10*y.a00 + x.a11*y.a10) % MOD,
		(x.a10*y.a01 + x.a11*y.a11) % MOD,
	}
}

func powMod(a, e int64) int64 {
	a %= MOD
	res := int64(1)
	for e > 0 {
		if e&1 == 1 {
			res = res * a % MOD
		}
		a = a * a % MOD
		e >>= 1
	}
	return res
}

type Event struct {
	num, den int64
	edge     int
	code     int
}

func main() {
	data, _ := io.ReadAll(os.Stdin)
	idx := 0
	nextInt := func() int64 {
		for idx < len(data) {
			c := data[idx]
			if c == ' ' || c == '\n' || c == '\r' || c == '\t' {
				idx++
			} else {
				break
			}
		}
		sign := int64(1)
		if data[idx] == '-' {
			sign = -1
			idx++
		}
		val := int64(0)
		for idx < len(data) {
			c := data[idx]
			if c < '0' || c > '9' {
				break
			}
			val = val*10 + int64(c-'0')
			idx++
		}
		return sign * val
	}

	n := int(nextInt())
	x := make([]int64, n)
	v := make([]int64, n)
	wl := make([]int64, n)
	wr := make([]int64, n)

	inv100 := powMod(100, MOD-2)
	for i := 0; i < n; i++ {
		x[i] = nextInt()
		v[i] = nextInt()
		p := nextInt()
		wr[i] = p % MOD * inv100 % MOD
		wl[i] = (100 - p) % MOD * inv100 % MOD
	}

	if n == 1 {
		fmt.Println(0)
		return
	}

	m := n - 1
	mats := make([]Mat, m)
	events := make([]Event, 0, 3*m)

	for i := 0; i < m; i++ {
		mats[i] = Mat{wl[i+1], wr[i+1], wl[i+1], wr[i+1]}
		d := x[i+1] - x[i]
		events = append(events, Event{d, v[i] + v[i+1], i, 1})
		if v[i] > v[i+1] {
			events = append(events, Event{d, v[i] - v[i+1], i, 2})
		}
		if v[i] < v[i+1] {
			events = append(events, Event{d, v[i+1] - v[i], i, 0})
		}
	}

	size := 1
	for size < m {
		size <<= 1
	}
	id := Mat{1, 0, 0, 1}
	tree := make([]Mat, 2*size)
	for i := 0; i < size; i++ {
		tree[size+i] = id
	}
	for i := 0; i < m; i++ {
		tree[size+i] = mats[i]
	}
	for i := size - 1; i > 0; i-- {
		tree[i] = mul(tree[i<<1], tree[i<<1|1])
	}

	update := func(pos int, val Mat) {
		p := size + pos
		tree[p] = val
		for p >>= 1; p > 0; p >>= 1 {
			tree[p] = mul(tree[p<<1], tree[p<<1|1])
		}
	}

	getProb := func() int64 {
		root := tree[1]
		s0 := root.a00 + root.a01
		if s0 >= MOD {
			s0 -= MOD
		}
		s1 := root.a10 + root.a11
		if s1 >= MOD {
			s1 -= MOD
		}
		return (wl[0]*s0 + wr[0]*s1) % MOD
	}

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

	prev := getProb()
	ans := int64(0)

	for i := 0; i < len(events); {
		j := i + 1
		for j < len(events) && events[j].num*events[i].den == events[i].num*events[j].den {
			j++
		}

		for k := i; k < j; k++ {
			ev := events[k]
			mat := mats[ev.edge]
			if ev.code == 0 {
				mat.a00 = 0
			} else if ev.code == 1 {
				mat.a10 = 0
			} else {
				mat.a11 = 0
			}
			mats[ev.edge] = mat
			update(ev.edge, mat)
		}

		cur := getProb()
		diff := prev - cur
		if diff < 0 {
			diff += MOD
		}
		tmod := events[i].num % MOD * powMod(events[i].den%MOD, MOD-2) % MOD
		ans = (ans + tmod*diff) % MOD
		prev = cur
		i = j
	}

	fmt.Println(ans)
}