Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

HUPC 2019 Day2 H: Revenge of UMG

31 vues

Publié le

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

Publié dans : Technologie
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

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

×