Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

HUPC 2019 Day2 H: Revenge of UMG

2019/7/15 北海道大学プログラミング合宿 Day2 (有志セット: drken, idsigma, tempura0224, tsutaj, tubuann) H 問題
※文字が見えない場合は、ダウンロードするかフルスクリーンにしてご覧ください

  • Be the first to comment

  • Be the first to like this

HUPC 2019 Day2 H: Revenge of UMG

  1. 1. 北大合宿 2019 Day2 H: Revenge of UMG 原案: tempura 問題文: drken 解答: tempura・tsutaj・tubuann・drken 解説: tempura 2019 年 7 月 15 日 tempura HUPC 2019 Day2 H 2019/7/15 1 / 8
  2. 2. 問題 Revenge of UMG ’?’, ’U’, ’M’, ’G’ からなる文字列 S が与えられる ’?’ のそれぞれを ’U’, ’M’, ’G’ のいずれかに置き換えて得られる全て の文字列 T について 1 ≤ i < j < k ≤ |T| j − i = k − j Ti =’U’ かつ Tj =’M’ かつ Tk =’G’ となる (i, j, k) の組の数を数えてその合計を 998244353 でわった余り を答えよ。 制約 1 ≤ |S| ≤ 2 × 105 tempura HUPC 2019 Day2 H 2019/7/15 2 / 8
  3. 3. 少し簡単な問題 とりあえず ’?’ のない文字列について考える tempura HUPC 2019 Day2 H 2019/7/15 3 / 8
  4. 4. 少し簡単な問題 とりあえず ’?’ のない文字列について考える 真ん中を固定して考えることにすると、各 j について i + k = 2j i < k Ti =’U’ かつ Tk =’M’ をみたす (i, k) の組の数が (高速に) 分かればいい tempura HUPC 2019 Day2 H 2019/7/15 3 / 8
  5. 5. 少し簡単な問題 ここで、 U[x] = 1(Tx =’U’ のとき),0(else) G[x] = 1(Tx =’G’ のとき),0(else) と定める tempura HUPC 2019 Day2 H 2019/7/15 4 / 8
  6. 6. 少し簡単な問題 ここで、 U[x] = 1(Tx =’U’ のとき),0(else) G[x] = 1(Tx =’G’ のとき),0(else) と定める すると、求めたいものは ∑ i+k=2j,i<k U[i] × G[k] tempura HUPC 2019 Day2 H 2019/7/15 4 / 8
  7. 7. 少し簡単な問題 ここで、 U[x] = 1(Tx =’U’ のとき),0(else) G[x] = 1(Tx =’G’ のとき),0(else) と定める すると、求めたいものは ∑ i+k=2j,i<k U[i] × G[k] 畳み込みっぽい! tempura HUPC 2019 Day2 H 2019/7/15 4 / 8
  8. 8. さらに簡単な問題 もし i < k の条件がなければ、 ∑ i+k=2j,i<k U[i] × G[k] は、多項式 U[1]x + U[2]x2 + · · · + U[N]xN と G[1]x + G[2]x2 + · · · + G[N]xN の積の x2j の係数 tempura HUPC 2019 Day2 H 2019/7/15 5 / 8
  9. 9. さらに簡単な問題 もし i < k の条件がなければ、 ∑ i+k=2j,i<k U[i] × G[k] は、多項式 U[1]x + U[2]x2 + · · · + U[N]xN と G[1]x + G[2]x2 + · · · + G[N]xN の積の x2j の係数 多項式の掛け算は FFT(or NTT) で O(N log N) で計算することがで きるので解けた tempura HUPC 2019 Day2 H 2019/7/15 5 / 8
  10. 10. 少し簡単な問題 i < k をみたすものだけを数えるにはどうすればいいか? tempura HUPC 2019 Day2 H 2019/7/15 6 / 8
  11. 11. 少し簡単な問題 i < k をみたすものだけを数えるにはどうすればいいか? もとの多項式のかわりに、 U[1]x + U[2]x2 + · · · + U[N 2 ]x N 2 と G[N 2 + 1]x N 2 +1 + G[N 2 + 2]x N 2 +2 + · · · + G[N]xN の積を考える tempura HUPC 2019 Day2 H 2019/7/15 6 / 8
  12. 12. 少し簡単な問題 i < k をみたすものだけを数えるにはどうすればいいか? もとの多項式のかわりに、 U[1]x + U[2]x2 + · · · + U[N 2 ]x N 2 と G[N 2 + 1]x N 2 +1 + G[N 2 + 2]x N 2 +2 + · · · + G[N]xN の積を考える これにより、1 ≤ i ≤ N 2 , N 2 + 1 ≤ k ≤ N なる (i, k) の組全てについ て数えることができる tempura HUPC 2019 Day2 H 2019/7/15 6 / 8
  13. 13. 少し簡単な問題 あと考慮すべきものは、 1 ≤ i < k ≤ N 2 と N 2 + 1 ≤ i < k ≤ N の 2 つ tempura HUPC 2019 Day2 H 2019/7/15 7 / 8
  14. 14. 少し簡単な問題 あと考慮すべきものは、 1 ≤ i < k ≤ N 2 と N 2 + 1 ≤ i < k ≤ N の 2 つ これはもとの問題の半分のサイズの問題 ×2 tempura HUPC 2019 Day2 H 2019/7/15 7 / 8
  15. 15. 少し簡単な問題 あと考慮すべきものは、 1 ≤ i < k ≤ N 2 と N 2 + 1 ≤ i < k ≤ N の 2 つ これはもとの問題の半分のサイズの問題 ×2 分割統治のように順々に半分にしていくことで全体で O(N(log N)2) で解けた。 tempura HUPC 2019 Day2 H 2019/7/15 7 / 8
  16. 16. もとの問題 ’?’ がある場合は? tempura HUPC 2019 Day2 H 2019/7/15 8 / 8
  17. 17. もとの問題 ’?’ がある場合は? ’?’ は’U’, ’M’, ’G’ にそれぞれ確率 1 3 でなるとして UMG 数の期待値 を計算して、最後に 3Q 倍すればおっけー U[x] = 1(Sx =’U’ のとき), 1 3 (Sx =’?’ のとき), 0(else) にする 各 x2j の係数について、Sj =’M’ ならそのまま足す、 Sj =’?’ なら 1 3 倍して足す tempura HUPC 2019 Day2 H 2019/7/15 8 / 8
  18. 18. Writer 解・統計 Writer 解 tempura (C++・124 行・3151 bytes) tsutaj (C++・111 行・2969 bytes) tubuann (C++・299 行・6971 bytes) drken (C++・122 行・4106 bytes) 統計 AC / tried: 3 / 17 (17.6% ) First AC On-site: – (– min – sec) On-line: The_Way (113 min 40 sec) tempura HUPC 2019 Day2 H 2019/7/15 9 / 8

    Be the first to comment

    Login to see the comments

2019/7/15 北海道大学プログラミング合宿 Day2 (有志セット: drken, idsigma, tempura0224, tsutaj, tubuann) H 問題 ※文字が見えない場合は、ダウンロードするかフルスクリーンにしてご覧ください

Views

Total views

138

On Slideshare

0

From embeds

0

Number of embeds

0

Actions

Downloads

1

Shares

0

Comments

0

Likes

0

×