Codeforces Round 1087

A. Flip Flops

小さい $a_i$ から貪欲に処理します.

B. Array

「$a_i$ 以下のもの」「$a_i$ 以上のもの」どちらかはカウントされません.

$k=a_i\pm 1$ とすることで,「$a_i$ より大きいもの」「$a_i$ より小さいものもの」をカウント対象とすることができるので,この $2$ 種どちらかが最適です.制約が小さいので $2$ 重ループでよいです.

C. Find the Zero

まず $n=2$ を解くのに苦戦しましたが.この場合は $\binom{4}{2}=6$ 通りあるうちの,$1$ つの候補をチェックできるということです.$3$ 回聞いても残り $3$ 通り残ってしまい,この時点で答を確定させなければいけないので,ここから戦略を考えます.

結論として $n=2$ ならば,$(1,2),(1,3),(2,3)$ を質問すればよいことが分かります.

$n\geq 3$ のときは,「質問 $1$ 回で $n$ をひとつ減らす」ことを考えます.$(2n-1,2n)$ を聞いて $1$ が返ってきたら解決,そうでなければこの中には $0$ が $1$ 個以下しかないので,$[1,2n-2]$ に $n-1$ 個以上の $0$ があり,$n-1$ の場合に帰着できます.

D. Ghostfires

実験して合うまで実装すれば通る,というタイプ.

まず,多すぎるもの($0,2,4,\ldots$ 番目に置いても置き切れないもの)があると無理です.そうでないならばできることを実験でチェックしました.あとは構築です.

文字を A,B,C,最大種類のものを C として,”C?C?C?C?CACABABABA” の形で作ることにしました.実験すると,A,B,C が同数あって偶数のときだけ失敗していたのでこれを調整しました.証明は詰めてないけど成り立つなら証明は難しくないはず.

E. A Trivial String Problem

$Q$ が小さいので,クエリごとに完全独立に $O(N)$ かけて解いてもよいという計算量です.

まず $f(t)$ について考えると,prefix とマッチする suffix のうちで最も短いものを後ろからとっていく貪欲でよいことが分かります.よってこの「最も短いもの」を求めます.

KMP を使うのが自然だと思います.私はうっかり Z-algo を使ってごちゃごちゃしましたが.これでマッチする prefix のうちひとつがとれるので,小さい prefix から順に,「suffix のうちで最も短いもの」を求めていけます.あとは簡単な dp で.

F. Dynamic Values And Maximum Sum

中身がない割に読解が難しい?

一度葉に移動した値は,そこから動くことはありません.なので,初手を固定すると $2$ 手目以降は葉に溜まっている値を大きいものから拾っていくだけです.

よって,初手 $N$ 通りごとに答を計算という方針で解けます.初手に選ぶ根をひとつずらす ($v\to w$) と,$a_v$ が新たにどこかに移動,$a_u$ がどこかに移動していたものがキャンセルされる,ということになります.

この移動先は全方位木 dp で求まって,あとは「multiset に値を出し入れしながら top $K$ sum を求める」をやるだけです.

CodeForces
スポンサーリンク
シェアする
maspyをフォローする
maspyのHP
タイトルとURLをコピーしました