AGC043 D - Merge Triplets
解法
いろいろな数列を試していると、4つ以上の連続する区間が単調減少することはありません。
この原因を考えてみると、長さ3の数列を作成しているため、4つ単調減少させようとすると、1つの長さ3の数列 + どこか1か所別の値が選ばれる必要があります。
長さ3の数列の先頭と、のこりの1つの要素のどちらが小さい場合でも、これらを単調減少させつつPの末尾に追加することは不可能です。
単調減少の先頭に注目、というのを少し拡大し、Pの完成形としてありうる数列に対し、
- 今までの要素の最大値が出てきたときに、その最大値と、その前の要素で区切る
という操作を繰り返すと、長さ3以下のブロックのようなものがたくさん出来上がります。これらのブロックを組み合わせて、その順番でPに追加できるようなが作成できれば、答えにカウントできます。
これまたいろいろ手元で試すと、
- 長さ3のブロックの個数 + 長さ2のブロックの個数が以下
であれば、が作成可能であることがわかります。
長さ3はそのままにすればよく、長さ2のブロックに対しては、適当に長さ1のブロックと組み合わせ、それぞれの先頭の要素の小さい方をの先頭にすればよいです。残った長さ1のブロックは、適当に昇順に並べます。
これにより、長さ3以下のブロック集合の作成方法が、そのまま答えになることがわかりました。
長さ2のブロックは、先頭 > 末尾となっていればよいです。
長さ3のブロックは、に対し、の2通りが考えられます。
長さ3のブロックを個作成する、とした時、
通りの組み合わせが考えられます。
そして、残った数の中から長さ2のブロックを個作成する時、
通りの組み合わせが考えられるので、これを全てののペアについて考えればよいです。
感想
昔解けなかった数え上げシリーズが解けていくのは楽しいです!(前も言った気がします)
ARC082 F - Sandglass
解法
クエリが時間順で並んでいるので、時刻を進めながらクエリに答えていくことを目指します。
時刻のクエリに答えるには、となるようなの中で最大の時刻まで時を進めて砂の量を調べ、最後にひっくり返す部分だけシミュレートすれば良いです。
よって、それぞれのにて、最初の砂の量がであった場合にどうなっているか、がわかればよいことになります。
また、砂の量をで始めたにも関わらず途中で砂時計の上部の砂が空になり、全て下部にたまった場合、砂の量は始めであった場合と同一視できます。
このような状態になるは、区間になっているので、その境界を見つけることができればよいです。
途中で空にならなかった場合は、砂時計をシミュレートしていった場合の増減を累積和で記録しておくことで、ある時刻における砂の量がわかります。
よって、あとはと同一視できる区間の境界が求まればよいことがわかりました。
まず明らかにの場合、任意のが初めからもしくはであったとわかります。
そうでない場合も、増減の累積和を確認し、ある時刻にになるの区間をマージしていくことで、高速に求めることができます。
感想
おおまかな方針はたっていたのですが、細かい部分を詰めるのに結構時間がかかりました。実装もあんまり綺麗ではない?気がするのでもう少しどうにかしたいです。
Typical DP Contest I - イウィ
解法
操作をいろいろ試してみると、一連の操作で消すことができる部分というのは区間になっていることがわかります。
- の区間の文字全てを消すことができるかどうか
という区間DPを考えます。が3の倍数でない時はもちろんNO
です。
を全て消去するには、
を満たすについて、が共に
YES
となるものが存在するが
i
、がw
であり、とがYES
のいずれかを満たしていればよいです。(のような空の区間についてもYES
とみなしています)
よって、上記のいずれかを満たしていればYES
とすることで、ある区間について全て削除できるかどうかがわかるようになります。
さて、
- について行うことができる操作の最大回数
として、再び区間DPをすることでこの問題に答えていきます。
がYES
のとき、は明らかにとなります。
そうでない場合は、
によって計算できます。
以上により、答えを求めることができました。
感想
昔はとっかかりすらつかめなかったものがさらりと解けると嬉しいですね!考察、実装ともにサクサク行けたので良かったです。
嘘解法はよくないですね!!!(上の解説は修正済みです)
CODE FESTIVAL 2017 qual C D - Yet Another Palindrome Partitioning
解法
が回文になる条件は、a
~ z
について、に含まれる個数が全て偶数になる、もしくはどれか1つのみが奇数になる、のどちらかです。
a
, b
, ..., z
とします。
先頭の文字から番目の文字までを見て、奇数個になる文字について、を計算したものをとします。
が回文になる条件は、との排他的論理和を取った際に立つ2進数のbitが1個以下になる、というものに言い換えられます。
- 文字目までで、分割できる回文の個数の最小値
を考えると、
という遷移が成り立ちます。
ここで、はを2進表記した際に立つビットの個数とします。
これだけみるとになりますが、それぞれの2進表記で一番小さい値となるものをメモしておけば、27通りについて確認するだけで問題ありません(2進表記は、が累積xorを取っているだけなので最大通りです)。
あとはこれを計算し、を求めればおしまいです。
感想
とても面白かったです。
ARC099 E - Independence
解法
頂点との間に辺が張られていない場合、これらを同じ州に含めることができません。
これは全ての張られていない辺について成り立ちます。逆に、同じ州に含めることができない頂点対に辺を張ったグラフを考えると(これは与えられるグラフの補グラフです)、それぞれの連結成分が二部グラフになっている必要があることがわかります。
ということで、まず構築できる条件がわかったのでチェックします。
二部グラフ判定は、補グラフについてワーシャルフロイドを適用した後、全ての頂点のタプルについて、との距離の偶奇が、からの距離とからの距離の和の偶奇と一致しているかどうかを見ればよいです。
さて、辺の数を最小にする問題を考えます。
ある州に個の頂点を含ませた場合、そこに存在する辺の本数は
です。また、もう片方の州は個の頂点が存在しているはずで、こちらも同様に辺の本数を数えることができます。
ということで、州の個数がにできるかどうかを判定し、できる個数のうち辺が最小のものを選べば答えとなります。
あとは、個からなる州が作成可能かどうかわかればよいです。
先ほどの補グラフに再び注目します。
ある連結成分についてみると、二部グラフの頂点のグループは一意に定まります(適当な頂点からの距離を調べ、偶奇でグループ分けすればよいです)。
ですが、どちらのグループを州に含めるか、というのはそれぞれの連結成分ごとに自由に決められます。
ということで、
- 番目の連結成分までみて、個からなる州の集合が作成可能かどうか(bool値)
というdpが考えられます。
今見ている連結成分のグループの個数のペアがだった際、
という遷移を行えばよいです。
これで、作成できる州の頂点数がわかったので、あとは最小値を計算すれば終わりになります。
感想
補グラフと二部グラフがうまく考察できたので嬉しいです。面白かったです。
AGC029 D - Grid game
解法
高橋君が動かない、という操作を選択した場合、青木君は動かない、という操作を行ってゲームを終了させればよいので、高橋君が駒を動かさない、という選択肢は存在しません。
よって、高橋君が動けなくなるように青木君がうまく動けばよいです。
駒が列目にある際にゲームが終了すると仮定します。
青木君は、回、どこかで移動を行うことになります。
このときに青木君はどのタイミングで移動を行えばよいか?を考えます。
ゲームが終了するのは、という障害物が存在する場合で、かつに駒を動かすことができるときです。
この際に高橋君が行う操作の回数は、回です。
ということで、高橋君が行う操作の回数は、ストップする障害物の位置のみに依存し、青木君がどのような行動をとるか、には依存しません。
なので、できるだけ上の行に存在する障害物でストップさせたいので、極力はやく、列目に移動することが最適になります。
ということで、列目でストップする際は、
高橋君:常に移動する
青木君:列目より左に居た場合、右に障害物がなければ移動する、そうでなければ移動しない
という操作が最適になります。
あとは、列目でストップする場合の回数を全ての列について計算すればよいです。
列目に移動したときに何行目にいるか、というのは愚直にシミュレートすればよいです。
感想
すらすらと考察できたので、あとは実装スピードです。