Codeforces Round 488 by NEAR

A. Two Squares

交わるならば,座標が半整数の点でも交わります.座標が小さいので全探索してしまえばよいです.

B. Open Communication

少し条件がややこしいですが普通に全探索できます.

C. Careful Maneuvering

一機以上を攻撃できる $x$ 座標の候補が少なくて,その $2$ 個組も少ないです.

D. Compute Power

平均値の最小化は二分探索で行います.

二分探索内では dp をします.コストの大きいものから使い方を決めるようにして,各時点で「$2$ 回使うことにした回数」「$1$ 回使うことにした回数」の組を状態とすればよいです.

E. Nikita and Order Statistics

01 列があって,区間和の頻度集計をする問題になります.

累積和をとって,$A[r]-A[l]$ の集計をする問題だということにします.

$l<r$ という条件下で数えるべきですが,この条件を無視して数えたあと負の部分は捨てて,$0$ の部分だけ適切にすればよいです.

よって,$A[i]+B[j]$ の集計をするという問題になって,畳み込み一回で解けます.

F. The Moral Dilemma

公式解説が間違っているので注意してください(途中までは正しいです).

コメントには独立集合列挙を含む解法があるようですが,多項式時間で解けます.

まず第 2 層のノード単体での出力について,通常モードの出力と反転モードの出力を $(y,z)$ とします.$(y,z)=(1,1)$ となるような入力がある場合,このノードは解に含めることはできません.

これがない場合,「常に $y=0$」「常に $z=0$」のうちちょうど一方が成り立ちます.さらに,入力が $(1,1,1,\ldots)$ であるときにもう一方の出力が $1$ になります.これらはこのノードに関係するネットワーク構造を全探索することで証明できます.これによって,ノードタイプを $2$ 種に分類します.

$2$ 種のノードが混ざっていると,入力が $(1,1,1,\ldots)$ であるときに矛盾します.よって調べるべき解の候補は,単一種類のノードだけからなる場合だけです.

$z=0$ タイプのノードのみからなる場合,反転モードでの第 $2$ 層は $(0,0,0,\ldots)$ となり,これらの nor として反転モードの出力は $1$ です.よって条件が成り立つためには,任意の入力に対して通常モードでの出力が $1$ であることが必要十分になります.これはノードが多いほど成り立ちやすい条件なので,このタイプのノードを全部ネットワークに含めた場合だけを検証すればよいです.

これで条件が成り立つかどうかを調べるには,通常モードでの出力が $0$ になるような入力が存在するかどうかを調べればよいです.さらにこのとき,第 2 層のノードは OR, NAND しかなくて,第 1 層のノードの値はすべて確定します.すると入力が満たすべき条件は two sat の形で書けるので線形時間で条件を判定可能です.

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