ICPC2021模擬国内 参加記
公式link
suzuken君と、bayashiko君とチーム"MSB"で出場しました。
ブログを書くのが久々で緊張しています。
day 0
ポケモンユナイトにハマりました。同じICPCに別のチームで出ているすず君と毎晩のようにプレイしており、一時期は5000位くらいでした。
今はレート1409で7000位くらいです。
8~9月はAOJ-ICPCを埋めて、精進メモを毎週書いていたのですが、突如モチベがぷつりと切れてしまい、後輩にばかすか抜かれました。残念。
本番
初手はばやしこくんがA、すずけんくんがB、僕がCを読みました。
僕がCを読んで†実装問題†だとわかった瞬間、一昨年の国内予選本番で実装をバグらせた記憶が蘇りました。これは誰かに実装を押し付けるしかない!と思い、すぐさまDを読みました。
Dもパッと見でわからず(2乗なら通るのになぁ~って言ってました、はやく書けばよかったです)、すずけんくんにBのヘルプを求められたので、考察の手伝いをしました。
そうこうしている間にばやしこくんがAを通しました。
ばやしこくんの手が空いたので、すかさずCを押し付けます。ばやしこくんは実装系が一番苦手ですが、ここはやむなし。心を鬼にして譲ります。
僕はEを読み、ぱっと見でわからなかったため、Dへ戻りました。その間に、Bが通りました。
しばらくしてCも通ります。D問題を僕とすずけん君で考え、2乗が通るじゃん、という話になったため、僕が実装を開始します。
すると、数分後、ばやしこ君がこう言いました。
「Eのサンプルあったので投げます」
何かの言い間違いだろうと思い、笑ってごまかしました。念のため、
「どういう解法なの?」
と聞きます。すると、
「転倒数とLIS組み合わせたらサンプル合いました」
と言います。どうやら本当らしいです。
さすがに嘘でしょ、とゲラゲラ笑いながらDを実装していましたが、数分後、
「一つ目のケース通りました」
と言われました。もう何も信用できなくなりました。
結局、僕がDを通すより20分もはやく、Eが通りました。わけがわかりません。
僕が盛大にバグらせてひいひい言いながらDを通した後、3人でFとGを交互に考えます。僕はFをほとんど考えずGに突っ込んでいました(大失敗)。
すずけんくんがFでとりあえず適当なDPを書くと言っていたので投げました。
実装が終わるも、WAが出ます。
さすがに僕もFを考えよう、と思い、10秒くらい見つめると、なんと解法がすぐに降りてきて叫びました。
「これ、区間DPじゃん!w」
嘘でした。
3分間くらい、チームメイトからすごい、天才、さすがです、とすごく褒められていたので申し訳ない気持ちになりました。
冷静になり考え直して、しっかり正しい解法を出しました。
すずけん君に伝えた後、僕も暇なので、昨年の国内予選優勝チームを真似て、どちらがはやくACできるか勝負することにしました。
負けました。
この時点で2時間たっていました。まだ1時間ありますが、G問題が不可能にしか見えなかったため、Fのデバッグをずっとしていました(1行変えれば通りました)。
その後は、三人で一生感想戦をしたり、Dの線形解を考えたりしていました。
今回はばやしこくんの大活躍のおかげでライバルチームに圧勝したかな、と思っていましたが、結局皆完数で並びました。 他のチームは完全体でないチームもあったため、かなり驚きました。
結果
15位でした。コンテスト中は16位と書いてありましたが、なぜかあがっています。
おわり
去年、模擬国内で16位を取ってから予選に落ちました。
今年は、昨年のチームメイトであるるぎうさん、とまとさんがコーチをしてくださっています。直々に頑張ってとも言われたので、今年はきちんと国内予選を勝ち抜きたいと思います。
頑張ります。
p.s. 本番で大学へ行く予定なので、ラーメンを食べるのが楽しみです。
精進メモ 2021/10/04~
書き忘れてました。
MojaCoder Random Xor Division
リンク
が想定っぽい?ですが、で解けました。
ビットごとに見ます。すると、累積和の偶奇で右端を固定したときの相方の候補が出せます。
数日前のABC-E問題同様、2の冪乗の累積和を計算して、右端より右側で自由に切れる部分、左端より左側で自由に切れる部分のパターン数が計算できます。
あとは、ビットごとに上記を計算していき、総和を取って、全体のパターン数であるで割れば答えです。
ABC222
C - Swiss-System Tournament
毎回愚直に対戦させ、勝利数を計算してからソートしなおしていけばOKです。
D - Between Two Arrays
DPをいもすで高速化します。
E - Red and Blue Tree
辺ごとに通る回数をメモしてから、差が問題の条件を満たすようDPすればOKです。一回も通らないものは素直に2倍していきます。
F - Expensive Expense
全方位木DPです。
を根とする部分木で、からどこかへ観光しに行ったときにかかるコストの最大値、として計算します。
G - 222
離散対数問題のライブラリがバグっていてコンテスト中に通せませんでした。
漸化式の解き方をググって解くと、という式が出てきます。
これがの倍数になれば良いです。
少し変形すると、
となります。
あとはこれを満たす最小のを求めればOKです。
精進メモ 2021/09/27~
気温の変化にやられて一日中鼻かんでます。
AOJ-ICPC
2169 Colored Octahedra
素直に全探索します。
next_permutationで全列挙し、ひたすら回転させました。
2249 Road Construction
ダイクストラをしてから、近い順に最小全域木を計算していきます。
2178 Futon
隣接するマスを同一視して、二部グラフ判定します。
実装に少し困りました。
2302 On or Off
それぞれのマスで通る時刻はわかっているので、マスごとに計算すればよいです。
回目に通った後、電気がオンになっている/オフになっている()ようなスイッチの切り替え方における最小コスト
と定義して計算していけばよいです。
2019-2020 ICPC Southeastern European Regional Programming Contest (SEERC 2019)
チーム練です。
D. Cycle String?
出てくる回数が最大のものが以下であれば、適当にソートして出力でOKです。
そうでない場合、とに最大のもの以外を置き、あとは前から回数最大のものを順に詰めていきます。
最大のもの以外が3個以上あるか、種類が3種類以上であれば問題の条件を満たします。
そうでない場合は構築できません。
E. Life Transfer
BITを7本くらい用意してごり押しました。
年齢の降順にソートして、車、バイク、乗客、の順で選んでいきます。
車を運転する人の人数を全探索していけばよいです。
F. Game on a Tree
ずるしました。
昔かっつくんが解いた時のツイートを皆で思い出してしまいました…
移動できる頂点に辺を張り直し、完全マッチングが存在すれば後手の勝ちです。
適当にDFSをして、葉から貪欲にマッチングさせて頂点があまるかチェックすればおしまいです。
ABC221
可もなく不可もなく。
C - Select Mul
2回誤読してコードを書きなおしました。
ビット全探索して降順ソートです。
leading zeroは無視してOKです(どちらにしろ答えが0になるので正しい答えが出ます)。
D - Online games
イベントソートして日付ごとに処理をしました。
E - LEQ
得意分野なので自分の体感難易度とまわりがズレていました。
数列の最初と最後を決めると、間の要素を任意に選ぶか選ばないか、になります。2の冪乗です。
を決め打ったときの選び方は、累積積のようにしてで計算できます。
あとはBITで累積積をまとめて計算すればいいです。
F - Diameter set
直径の偶奇で場合分けをしました。
奇数距離の場合は、中心が2頂点に分かれます。それぞれの中心で木をわけたとき、それぞれで直径として選べる端点が計算できますが、2つの木のそれぞれから1つずつ選ぶしか方法がありません。
よって、それぞれの木の候補の数の積が答えです。
偶数距離の場合は、中心が1つになります。中心と隣接している頂点との辺で木を複数に分けたとき、先ほどと同様に直径として選ぶ候補がそれぞれの部分木で数えられます。それぞれの部分木から最大で1つ(0でもよい)頂点を選べるので、(個数 + 1)の漱石を計算します。
ここから、一つも選ばれないパターンと、一つだけ選ばれるパターンが条件を満たさないので引けば答えです。
精進メモ 2021/09/20~
もうすぐ秋学期が始まりますね。夏休み返して…
- AOJ-ICPC
- Educational Codeforces Round 114 E. Coloring
- Aizu Competitive Programming Camp 2021 Day 1
- Aizu Competitive Programming Camp 2021 Day 2
- ARC127
- Aizu Competitive Programming Camp 2021 Day 3
- ABC220
AOJ-ICPC
これまで通り下から埋めるか、星付きを優先するか悩みます。
2170 Marked Ancestor
後ろから見ると見通しがよくなるやつです。
クエリが起きたタイミングを管理して、葉からのぼりつつ処理します。
クエリが起きたタイミングが、今見ている頂点のマークされるタイミングよりも遅ければ、その頂点の値を加算します。そうでなければ親にまわします。
親に渡すパートはマージテクを使えばOKです。
2224 Save your cats
閉路がない = 木(森)である
ということが条件なので、コストの正負を反転してから最小全域木を作成していきます。使わなかった辺のコストの総和が答えです。
1318 Long Distance Taxi
燃料を補填できる都市同士を移動できるかどうかを、それぞれの都市を始点としたダイクストラで調べます。
その後、移動できる都市に辺を張りなおしたグラフで再びダイクストラすればいいです。
1244 Molecular Formula
頑張って構文解析します。
式全体は ()1
で囲んでるとすると実装が楽になるかも?しれません。
Educational Codeforces Round 114 E. Coloring
縦で見ると、黒白…と白黒…のどちらかを選択することになります。
通りです。
横も同様ですが、全体が綺麗な市松模様になっている箇所が重複するので上手くひく必要があります。
また、隣接する2列が同じ並びになっているものが存在した場合、横方向で見ると黒黒、となっているため、一意に定まってしまいます。
そうなっていない行、もしくは列について、まだ確定していない部分の並びを決めていけば数えることができます(手抜きだと説明が難しいですね)。
Aizu Competitive Programming Camp 2021 Day 1
suzuken君、serpent君と3人で出ました。
ユナイトをしていたら開始まで残り5分になっており、チーム名が決まっていました。
E: ヘクト問題
番目の数列の番目の要素は、とすればよいです。
綺麗な性質がありそうだなと思っていたのですが、suzuken君が一言掛け算、と言ったのでこれを思いつきました。
F: SからTを作るやつ
操作2のみを繰り返して、長さを最大にしておきます。すると、0101...という文字列になります。この部分文字列であれば、任意の文字列をつくれます。
G: Round Tour
行きで番目、帰りで最後に番目を通り、から全ての頂点を通るルートにおける最小コスト
としてDPすればよいです。復元がバグっており間に合いませんでした。
H: TUAT文字列
子音と母音は全探索します。
これらを一つ決め打つと、作成できる文字列のパターン数はとなるので、ここから、より前、もしくはより後ろの文字列となっているものを数えればよいです。
Aizu Competitive Programming Camp 2021 Day 2
ICPCのチームで出ました。
B I am sleepy
秒後ににいるような移動の方法のなかでの最適解
としてDPすればいいです。pairを持たせます。
D WeightedLIS
までみた時点で数列の最後の値がになっているときの最適解
としてDPすればいいです。セグ木で更新します。
G Tree Propagation
dfsしながら答えを計算していきます。
から白い頂点の個数を引いていけばよいです。
距離がの頂点については、自分の部分木について、距離がの頂点の個数だけ部分木サイズ分の答えを引きます。
最後にを引けばおしまいです。
K All Clear
それぞれのステージに対して、腕前がであったときにクリアできる回数の最小値を計算すると、の増加に対して単調減少していきます。
この回数が切り替わるタイミングが答えの候補で、回しかありません。
ので、の降順でソートして逐一計算して、全探索すればOKです。
ARC127
Cの速度が…
A - Leading 1s
なんでもいいので実装できればいいです。がんばります。
B - Ternary Strings
先頭が0,1,2の文字列が個ずつあります。先頭が2の文字列について、辞書順をできるだけ小さくするようにすればいいです。
そのためには、先頭以外の残りの部分を、3進数でからまで表現していけばよいです。
先頭が0,1については問題の条件を満たすよう適当に文字列を生成すればいいです。
先頭が2の文字列を作成した後、で1ずつ加算していくのが楽でした。
C - Binary Strings
上位ビットから見ていくと一意に定まります。よく見る問題。
引き算は遅延セグ木で実装しました。
Aizu Competitive Programming Camp 2021 Day 3
ソロ参戦でした。チーム戦にソロ参戦は夢でした。
B: Sufficient Condition
素因数が2個以上含まれているものがあれば、答えが存在します。
個数を半分(切り上げ)にしていけばいいです。
C: Separate Number
総和がになるまでの累積和を取っていく、という操作を繰り返していきます。
その区間ごとに答えを計算します。
場合分けが少々多いので注意します。
D: Successive Tree
頂点が選ばれたときに足される距離の期待値を計算すると、あとは平均を取れば答えです。
頂点について加算される距離の期待値は、についての距離の期待値の平均 + 1になります。
あとは愚直に計算していけばOKです。
E: +- Switch
未証明です。鳩ノ巣っぽい問題なので、DFSで適当に調べたら通りました。
F: A2B
まずは、総和が変わらないことに気づきます。この手の問題は、何かが隣接swapになっていることが多いので頑張って探すと、累積和の隣接swapになっていることに気づきます。
あとは転倒数を計算すればおしまいです。
G: XOR Walk
との距離が奇数であれば、合計が奇数個になるように頂点を選んだ総XORであればなんでも作れます。
偶数であれば、頂点を偶数個選んだ総XORであればなんでも作れます。
二部グラフでない場合は奇数と偶数のルート両方作れるので、なんでも作れます。
奇数個、偶数個選んで総XORを最大化するには、を全要素に追加して基底を求めると、のビットが立っている場合は奇数個、そうでない場合は偶数個になります。
奇数個のパターンは、基底全体での最大値を求めればよく、偶数個は、のビットが立っていない要素のみで最大値を求めればいいです。
ABC220
C問題にやられました。
C - Long Sequence
をと誤読する痛恨のミスで15分 + 3ペナの大事故です。
二分探索でもループ回数計算するでも何でもいいです。
D - FG operation
DPします。
E - Distance on Large Perfect Binary Tree
深さがおなじ頂点達は対応するもう片方の頂点の個数が決まっています。
丁寧に相方の個数を探してあげればよいです。
何回で折れ曲がっているかで全探索しました。
F - Distance Sums 2
僕が作った問題の弱いバージョン。 きちんと貼りました。
G - Isosceles Trapezium
で線分全部を洗い出し、平行な直線を見ていきます。
元々の線分および、垂直二等分線の傾きと切片が一致していればいいです。
同一直線上に注意。
コンテストの80分あたりに提出していたコードのをに変えるだけでACしたので少し悲しいです。
精進メモ 2021/09/13~
AOJ-ICPC、350が埋まったのでだんだん辛くなってきました。
AOJ-ICPC
1399 Sixth Sense
suzuken君に投げられました。
辞書順が無ければソートして小さい方から貪欲に詰めていってOKです。
そのときのスコアを計算する関数を作っておきます。
答えの数列を前から決めていきます。
ある箇所について、まずより大きいか、そうでないかを選択します。どちらも、条件を満たす中で最小のものを選びます。
そのときのスコアを計算し、最終的に大きくなる方を選びます。同じであれば辞書順が大きくなる方です。
その後、条件を満たすなかで辞書順が最大になるような値を探します。
ここは二分探索で求めることができます。
これを繰り返すことで答えが求まります。
1337 Count the Regions
を完全に失念していました。
座標圧縮すると、マス目上でUnionfindを行って連結成分の個数を数える問題になります。
Northern Eurasia Finals Online 2020
絶不調でした。
Geometrical Combinatorics
諸悪の根源です。一問目に開いたのが運のつきでした。
斜めの直線ごとに見ていけば、公式を使って計算できるはず…なのですが、結局最後まで通りませんでした。誤差なのか、考慮もれなのかはいまだわかってないです。
A. Almost Balanced Tree
2を優先的に使います。
2と1の個数を基本的に半分になるように分けます。ズレる部分は1を移動させて微調整します。
Lookup Performance
ある頂点にいるとき、クエリに対して再帰を行わない条件は、今いる頂点のminとmaxがであるとき、
のいずれかの条件を満たすことが必要です。
また、ある頂点でこれらを満たした時、その部分木における頂点全てが上記の条件を満たします。
ということで、(上記の条件を満たさない頂点の個数)×2 + 1が答えです。
1,2番目の条件は簡単に数えることができます。
3番目は、suzuken君にwavelet treeで殴ってもらいました。
ABC219
爆死しました。ICPCチームメンバーが温まっているのでヨシとします。
D - Strange Lunchbox
個使って個の鯛焼きを買えるときに購入できるたこ焼きの最大値、としてDPをします。
初期値を間違えて2ペナしました…
E - Moat
あなぽこは含むものだと思っていたら、Clarで含みませんと言われて泣きました。
結局そこからバグり続けて終わりました。
囲まれているかどうかをビット全探索すればOKです。
村を全て含むか、連結であるかどうかは簡単に判定できます。後者はUnionfindでOKです。
あなぽこ判定は、白のマスが外側と全て繋がっているか判定すればいいです。途中から実装をしたため、手抜き実装をしたら
1111 1001 1001 1111
のケースで落ちるような実装になっていました。
F - Cleaning Robot
日曜日に解きました。
文字列一回分を1セットとし、到着するマス目を洗い出します。
そして、1セット単位で移動する距離も計算します。
これらが共に0であった場合は1セット分のマス目の個数が答えです。
のうち片方が0であった場合(が0であるとします)、重なるパターンは、到着するマス目に対し、とが一致し、となる場合です(は操作回数)。
なので、ごとにをメモしていき、の区間の共通部分を全体で考え、区間の幅を計算すると答えになります。
どちらも0でなかった場合は、
に対するをメモすると、同様の計算で答えが求まります。
ARC126
不調の後には好調がやってきます。
A - Make 10
FAまであと少しでした。
長さ3のものは優先的に使います。
それが終わったら、4を優先的に使います。
あとは2だけで作って終わりです。
B - Cross-free Matching
LISに気づきませんでした。
個めの線分まで見終えて、最後に選んだ線分のがであるときに選べる線分の最大値
とします。で線分をソートしておくと、上記のDPをセグ木で更新できるようになります。
が同じものは同時に更新する必要があります。
C - Maximize GCD
とても好きな問題です。
とすると、全部の要素を以上にできる場合は答えが簡単に求められます。余った操作回数を均等に割り振るようにすればよいです。
そうでない場合を考えます。
がにできるかどうかを考えた時、それぞれの要素はの倍数でなければなりません。について、その値以上のの倍数は一意に定まり、をソートしておくと、目標となるの倍数が同じ要素については連続して並んでくれます。
ということで、境界を二分探索やしゃくとりで求められれば、必要な操作回数が求まります。
の倍数のみ調べるので、全体で調べる回数は調和級数で収まります。
D - Pure Straight
はじめに嘘DPを書いていて時間をロスしました。
番目が右端で、集合に含まれる要素が番目から順に左側にならぶように操作したときの操作回数の最小値、とします。ただし、番目までの要素のみを用います。このDPは、番目の要素を用いない場合
という遷移になります。
用いる場合、に、番目の要素を正しい位置へ移動するコストを足したもので更新させます。
これを、右側のみの要素のみで構築するパターンについてもどうようにDPで計算します。
最後に、両方のパターンをマージして、ちょうどが全体になるようなものを計算し、答えを求めればOKです。
精進メモ 2021/09/06~
- Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma
- ICPC Central Russia Regional Contest (CRRC 18)
- ABC218
- AOJ-ICPC
Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma
suzuken君に投げられました。最初の実装に15分、そこからバグを取るのに15分でした。
セグ木に必要な要素をのせてがんばります。
答え、左端の値、右端の値、左端から続く広義単調増加な列の長さ、右端から続く広義単調増加な列の長さ、全体が単調増加かどうかのフラグ
を持たせると計算できます。
[1,2,3,4]と[5,6,1,2]をマージする場合に注意。
ICPC Central Russia Regional Contest (CRRC 18)
難読問題セットでした。つらい。
B. Gremlins attack!
通れるようになる家を順にUnionfindで繋いでいき、端とグレムリンの家が連結になるまで繰り返します。
D. We were trying to share an orange ...
全探索すればいいのですが、OEISが見つかったので埋め込みです。
多倍長が必要なのでpythonでした。
E. Hanoi Tower
愚直にシミュレートすればOKです。実はもっと簡単らしいです。
H. A self-describing sequence
他のチームは最近既出で秒殺だったらしいです。問題文が読めず無限に時間が溶けました。
7以上は似たような構築方法でいけるので、6までは埋め込みです。
J. R u really ready?
= p]の文字目、の文字目でちょうど終わりになるようなパターンの適用方法があるか?でDPしました。バチャ込みで現時点FAっぽいです。
ABC218
最近2桁順位が安定している気がします。対してARCは…
Aでななめよみした問題文が全然違うものになっており1ペナしました。
相変わらずHは解けません。
C - Shapes
一番難しいです。90度回転の関数を作って、チェック→回転→チェック…と4回繰り返します。
チェックは、左上の位置をS,Tそれぞれメモして、そこからチェックします。
左上の位置から右下方向だけ見てしまい、サンプルがずっとあっていませんでした(サンプル1のようなケースで落ちます)
D - Rectangles
縦の直線を全部作り、そこから数を数えました。
直線の端点のy座標のペアごとに個数を数え、そこから2つ選ぶパターンを答えに追加すればOKです。
E - Destruction
基本的に最小全域木を行い、使わなかったコストの総和が答えです。 コストが負の辺は全て繋いでおきます。残りはコストの昇順に辺を見ていきます。
F - Blocked Roads
全ての辺が使える状態での距離を求めます。距離は以下になっているはずです。つまり、最初の状態でのルートに含まれる辺を取り除く場合のみ、愚直にBFSで最短距離を計算すれば良いです。 面白かったです。
G - Game on Tree 2
最小値、最大値を選ぶパートはよくあるゲームの木DPと同じです。
中央値は、値を座圧し、BIT上で二分探索することで求められます。
AOJ-ICPC
1401 Estimating the Flood Risk
これ難しかったです…(本番、自分担当にならなくてよかった)
すでに決まっている位置の値に対し、全てのマスについて、Manhattan距離を足し引きしたものをメモすることで、それぞれのマスでの上限と下限が求まります。
あとは下限を全て足すと答えです。
2783 Parentheses
()()()...の状態から一番右側にある開き括弧を動かしていくと辞書順最小のものが作成できます。
それぞれの長さで作れる最大値は決まっているので、長さを決めた後は、答えと一致するように移動させればOKです。
2723 Surface Area of Cubes
外側の表面積を足します。その後、6×抜く個数を足しておきます。
ここから、余分に足した値を引いていきます。まずは、元々外側にある立方体を抜くケースで、これは表面に存在する面×2を引きます。
そして、抜く立方体同士が接している場所で、ここも接している箇所×2を引けばよいです。
2684 RLE Replacement
2乗が通るので、愚直に一致する箇所を調べ、置換すれば良いです。
置換元の文字が1種類の場合に注意です(この場合、置換前の文字列の長さが長い時は置換先の文字列より後ろに残ります)。
2599 Idempotent Filter
19個のマスの01パターンを全て試し、2回適用することを愚直にシミュレートします。
2857 Tournament Chart
構文解析です。形がかなり決まっているので、実装はかなり軽いです。
優勝者の勝利回数チェックが抜けており1ペナしました。
2858 Prime-Factor Prime
2から順番に、で割れる場所を割っていきます。の素数まで見ればOKです。
素因数の倍数だけきちんと見るようにすれば、調和級数によりで収まります(長さが )。
残った数が1より大きければ素因数をもう一つ足し、あとは問題の条件に合ってるかどうか判定していけばいいです。
難しかったですが面白いですね。
2913 Prime Routing
それぞれの頂点に偶数距離で到着する場合と奇数距離で到着する場合の最小値を両方メモします。
偶数距離が2であれば答えは2ですし、そうでなければ、奇数距離以上の最小の素数が答えです。
精進メモ 2021/08/30~
AOJ-ICPC、一進一退です。負けません(今突き放されていますが…)。
AOJ-ICPC
2303 Marathon Match
が回休憩をしたときに優勝する確率を、全てのについて計算すればよいです。
それぞれが回休憩するときの確率は、二項係数を使って求められます。
そして、そのときにに勝つために行えるの最大値も求められます(を全探索してもOKです)。
あとは、自分以外の全員に対して勝つ確率を計算して、総和を求めればOKです。
2156 Magic Slayer
AllとSingleでそれぞれ、
- だけダメージを与えるために必要なMPの最小値
を計算してあげます。あとは、Allで与えるダメージを固定したときに必要なSingleのMPの総和を計算してあげて答えを求めればよいです。
2534 Dictionary
まずは、接頭辞になっている文字列が後ろに来ている、サンプルの2つ目のケースを潰しておきます。
あとは、文字の種類ごとにどちらが前に来るべきかをメモして、矛盾がないかをチェックすれば良いです。
2177 Champernowne Constant
よくある問題です。
二分探索でスタートする位置を決めて、あとは適当にシミュレートします。
1379 Parallel Lines
傾きで直線を管理します。3点が同一直線上にないので楽に処理できます。
傾きごとに、その直線の部分集合を取った時の、点の集合に対するペアの個数を求めておきます。
あとは、点の集合に対するペアの個数をbitDPでマージしていけば良いです。
1400 Fast Forwarding
ICPC2019の横浜で解いた問題ですが、なんとコードをなくしました。
maxでどの速度にするか、を全部試します。
最低限必須な時間はあらかじめ除外して、残った部分を3進数で計算すればいいです。
ABC217
弊学top2の2人に一生勝てません。
D - Cutting Woods
setに入れて、set上の二分探索をすればOKです。
E - Sorting Queries
一瞬?となったので飛ばしましたが、帰ってきて冷静になるとすぐに解けました。
queue + priority_queueでいいですが、コンテスト中は何故かdeque + mapでやっています。やっぱり焦っていそうですね
F - Make Pair
操作を後ろからみると区間DPできる、というのはどこか別のところでも見た気がします。
区間を二つに分断し、それぞれでの操作をコンビネーションを使って並べていけば良いです。
境界回りがちょっと面倒でバグらせました。
G - Groups
ごとにまず個数を数えます。
すると、番目のグループまで見て、個のグループになるようなパターン数
というDPをすると、二乗の木DPのような形で計算量がで収まります。それぞれのグループで番号が一番若い人を目印にして重複をなくすのがポイントでした。
もしかしてこの解き方少ないですか?あまり見なかった気がします。
H - Snuketoon
コンテスト翌日にSlope Trickを履修すると、「そのまんまだ…」となりました。
時間の移動はシフト、ダメージはそのまま加算をすればOKです。後ろから見て、最後に原点の値を見てあげれば答えです。