- Translate each rule into one explicit state update.
- Maintain the invariant after every processed item.
- Return the accumulated state once all relevant input has been handled.
Code notes
- 125 lines of Go from the credited upstream file 1420D.go.
- The implementation visibly relies on sequence storage.
- No explicit loop blocks detected.
Complexity
Count the number and nesting of passes over the input, then include the maintained containers in the memory estimate.
Check the problem constraints before deciding whether this complexity will pass.
Use this to learn the idea, then write your own version.
1package main2 3import (4 "bufio"5 . "fmt"6 "io"7 "sort"8)9 1011func CF1420D(_r io.Reader, out io.Writer) {12 in := bufio.NewReader(_r)13 const mod = 99824435314 const mx int = 3e515 F := [mx + 1]int64{1}16 for i := 1; i <= mx; i++ {17 F[i] = F[i-1] * int64(i) % mod18 }19 pow := func(x, n int64) (res int64) {20 res = 121 for ; n > 0; n >>= 1 {22 if n&1 > 0 {23 res = res * x % mod24 }25 x = x * x % mod26 }27 return res28 }29 invF := [...]int64{mx: pow(F[mx], mod-2)}30 for i := mx; i > 0; i-- {31 invF[i-1] = invF[i] * int64(i) % mod32 }33 C := func(n, k int) int64 {34 if k < 0 || k > n {35 return 036 }37 return F[n] * invF[k] % mod * invF[n-k] % mod38 }39 40 var n, k, l, r, s, c int41 Fscan(in, &n, &k)42 a := make([]int, 0, n*2)43 for ; n > 0; n-- {44 Fscan(in, &l, &r)45 a = append(a, l<<1|1, (r+1)<<1)46 }47 sort.Ints(a)48 ans := int64(0)49 for i, x := range a {50 s += x&1*2 - 151 if x&1 > 0 {52 c++53 if a[i+1]&1 == 0 {54 ans += C(s, k) - C(s-c, k)55 c = 056 }57 }58 }59 Fprint(out, (ans%mod+mod)%mod)60}61 62func CF1420D_diffMap(_r io.Reader, out io.Writer) {63 in := bufio.NewReader(_r)64 const mod = 99824435365 const mx int = 3e566 F := [mx + 1]int64{1}67 for i := 1; i <= mx; i++ {68 F[i] = F[i-1] * int64(i) % mod69 }70 pow := func(x, n int64) (res int64) {71 res = 172 for ; n > 0; n >>= 1 {73 if n&1 > 0 {74 res = res * x % mod75 }76 x = x * x % mod77 }78 return res79 }80 invF := [...]int64{mx: pow(F[mx], mod-2)}81 for i := mx; i > 0; i-- {82 invF[i-1] = invF[i] * int64(i) % mod83 }84 C := func(n, k int) int64 {85 if k < 0 || k > n {86 return 087 }88 return F[n] * invF[k] % mod * invF[n-k] % mod89 }90 91 var n, k int92 Fscan(in, &n, &k)93 a := make([]struct{ l, r int }, n)94 for i := range a {95 Fscan(in, &a[i].l, &a[i].r)96 }97 98 cntX := map[int]int{}99 d := map[int]int{}100 for _, p := range a {101 cntX[p.l]++102 d[p.l]++103 d[p.r+1]--104 }105 xs := make([]int, 0, len(d))106 for k := range d {107 xs = append(xs, k)108 }109 sort.Ints(xs)110 cnt := make(map[int]int, len(xs))111 s := 0112 for _, v := range xs {113 s += d[v]114 cnt[v] = s115 }116 117 ans := int64(0)118 for x, c := range cntX {119 ans += C(cnt[x], k) - C(cnt[x]-c, k)120 }121 Fprint(out, (ans%mod+mod)%mod)122}123 124125