ARC148 - E ≥ K
ARC148-Eを解いた.
問題
長さ の数列
が与えられる.
の並べ替えであって、全ての隣接和が
以上であるものを数え上げよ.
解法
全ての
について
とすることで
の場合に帰着できる.
以下 の場合に帰着して考える.
の降順に数列に挿入していくことを考えると、負の要素を追加した場合は挿入可能な位置が一つ減少し、正の要素を追加した場合は挿入可能な位置が一つ増加するため、あとは挿入するごとに挿入可能位置の数をかけていく.
また、の要素に重複がある場合は最後にそれぞれの数の個数の階乗で割る必要がある.
感想
降順 / 昇順 に挿入の典型.
提出
https://atcoder.jp/contests/arc148/submissions/53994118
簡単のため、を倍にしている.
ARC119 - E Grid Repainting 3
ARC119-Eを解いた.
問題
×
の赤青二色のグリッドが与えられる.
赤マスに対してそのマスを含む行又は列を全て白く塗れる.
白マスの数を最大化する操作を一つ構築せよ.
解法
赤であるマスについて、頂点
と頂点
の間に辺を張った二部グラフを考えると、完全に独立とはいかないが分けて考えられそうだ.
まずは全体が連結な場合を解く.
その連結成分内の行・列すべてを白くするのは明らかに不可能な操作. しかし、その中から一つ行又は列を選んでそれに操作をしないことにすると、それ以外の行・列について操作が行える.
操作しないことにした行・列上にあった赤マスに注目すると(このようなマスは一つ以上存在しないとおかしい)、そのマスの用途は一つに絞られる(選んだ行・列に操作しなくてもよくなったため).
このように考えれば、連鎖的に後ろから操作が決められる.
ここで、全体の白マスの数は操作した行の数を、操作した列の数を
とすると、
と表され、どのような
を選択すればよいか簡単に求まり、各連結成分について行列どちらを選べばいいか定められる.
考察
どんな行・列の集合なら操作可能か考えるとうまくいく.
最初に一つ行・列を操作しないことにするとうまくいくように思えたが、連結成分ごとに考えるのがなかなか見えなかった.
提出コード
AGC018 - D Tree and Hamilton Path
AGC018-Dを解いた.
問題
頂点重み付き木が与えられる.
の順列
を選び、そのスコアを
と定める(
:=頂点
と頂点
の距離). スコアの最大値を出力せよ.
解説
まずスコアにを加えたものを考える.
主客転倒を考えればこの最大値は各辺について次の値を計算して足し合わせた値である(この値をとでも置いておく).
- 辺の重み
その辺を切った時の小さいほうの連結成分のサイズ
の移動で重心をまたぐように
を決めていけば達成できる.
このことを踏まえて、と
をそれぞれ
として固定したときにスコアの最大値が何になるか考える.
(i) 重心が一つ
重心をと置くと、スコアは
となる.
この最大値は簡単に求められる.
(ii) 重心が二つ
重心間の辺の重みをと置くと、
が達成でき、これが最大値である.
(i)とほぼ同じこと.
考察
重心分解初めて使った. 上界達成可能なんじゃね? というのは大事だね.
提出コード
Codeforces Div1 694-D Strange Housing
cf div1 694-Dを解いた.
問題
頂点
辺の無向グラフが与えられる.最初、全ての頂点が白で、次の条件を満たすようにいくつかの頂点を黒く塗ることを考える.
1. 両端が黒い辺が存在しない.
2. 全ての頂点の組について、片端が黒い辺のみを通って移動できる.
このような塗り方が存在するか判定し、存在するならば塗り方を構築せよ.
解法
グラフが連結でなければこのような塗り方は存在しない.
頂点からDFSを行い、その行きがけ順に貪欲に塗っていく.
隣接する頂点に一つでも黒い頂点があれば白、そうでなければ黒で塗れば必ず条件を満たす.
考察
連結なら可能そう
とりあえず全域木を取り、頂点を根としたときの深さの偶奇をもとに色を塗っていくことを考えると、両端が苦をの辺が存在してしまっても後からどうにでも調節できてしまうことがわかる.
提出コード
Codeforces Div1 692-B
cf div1 692-B
問題
からなる文字列
が与えられる.
中の
を全て
に書き換えて得られる文字列に対して、(連続とは限らない)部分列
が現れたらコスト
、
が現れたらコスト
がかかる.コストの最小値を求めよ.
解法
として一般性を失わない(そうでない場合、
をswap,
中の
をそれぞれ
に置き換えればよい).
中の全ての
を書き換えた後の文字列を
とすると、最適な
であって
を満たす整数組
は存在しないようなものが存在する.これはこのような組が存在するとして、
と
をswapしてもコストが増加しないことが容易にわかるため.
この考察での置き換え方は高々
通りに絞られたため、差分を管理していけば最小値が求まる.
考察
と
どっちを減らしたいかわからないので一つにそろえたくなる.
なんとなくの順の置き換え方は良くなさそうとわかる.
提出コード
ARC105 - E Keep Graph Disconnected
ARC105-Eを解いた,
問題
与えられた頂点
辺のグラフに対して先手と後手が辺を追加していく.しかし、頂点
と頂点
を連結にするような辺は追加できない.操作できなくなったら敗北、敗北しなかった方の勝利.
両者が最適に行動したときに勝利するのはどちらか.
解法
グラフの連結成分が二つで、頂点を含む連結成分と
を含む連結成分がそれぞれ完全グラフである状態で手番が回ってきた人は負ける. また、最終的なグラフが定まっていればその辺数と
が勝敗が容易に判断できる.
ここでが奇数であれば、最終的に頂点
を含む連結成分のサイズを
とすると、
辺が最終的に追加されないが、これは常に奇数であることから容易にどちらの勝利か判定できる.
が偶数の場合は、最終的な
の偶奇によって勝敗が定まる(片方は最終的に
を偶数にしたい、もう片方は
を奇数にしたいという状況になる). 最初に頂点
と連結である頂点の数を
として、同様に
を頂点
について定める.
と置き、この値によって場合分けする.
1. の場合
最終的にを偶数にしたい方の勝利(
が偶数よりサイズが奇数の連結成分の個数は偶数個、よって相手の操作を打ち消すような操作が確実にできる).
2. の場合
最終的にを奇数にしたい方の勝利(証明は1の場合と同じ).
3. の場合
先手の勝利(が偶数よりサイズが奇数の連結成分は奇数個、よって自分の有利な方に動かす方で1,2の場合に帰着できる).
よってUnionFindなどを用いてを求めれば答えが求まる.
考察
最終状態と辺の偶奇に注目できれば自然に.
提出コード
ABC201 - F Insertion Sort
ABC201-Fを解いた
問題
順列に対して、次の操作を繰り返し
を狭義単調増加にする。コストの最小値は?
- を満たす
を選択し、
を好きな位置に移動させる。
- を満たす
を選択し、
を左端に移動させる。
- を満たす
を選択し、
を右端に移動させる。
かかるコストは上から順にである。
解法
一番上の操作は下二つの操作の上位互換であるため、に
を、
に
を代入してよい。
一回も操作をしないindexの集合をを決めると、そのほかのindexに対する操作が一意に定まる。(具体的には、
を満たす
については左端への、
を満たす
については右端への、そうでない場合は自由な挿入の操作を選択する)
ここで、
を考えると、の順に
という遷移ができるが、このままでは間に合わない。これは最初に答えにを加算して置き(詳しくは実装を)、その差分を計算することを考え、区間min取得/一点更新ができるSegmentTreeを用いれば
で解が求まる。
考察
あんまり動かしたくない->動かさないものは単調増加->動かさないのに注目すればよさそう?