ツバサの備忘録

主に備忘録代わりに精進記録を載せていくつもりです。

ABC133 E - Virus Tree 2

問題
提出コード

解法

探索か何かをしつつ、今いる頂点について色を決ようとすると、その頂点から距離2以内で、すでに色が決まっている頂点がいくつあるかを調べる必要があり、とても大変です。
そこで、今いる頂点から行くことができる頂点について、色を決めることについて考えてみます。
f:id:emtubasa:20190708153456p:plain
上のような木について考えてみます。白い頂点が既に通過済みの色を塗られている頂点で、青い頂点が今いる頂点です(ここも色はすでに決まっています)。そして、クリーム色の頂点が、今から色を決める頂点になります。
3つのクリーム色の頂点に、順番に色を塗っていくことを考えると、
1番目の頂点にはK-2、2番目はK-3、3番目はK-4通りの塗り方が考えられます。
1番目の頂点は、白と青の頂点の分だけ色の選択肢がなくなり、2番目以降の頂点は、今塗ったクリーム色の頂点の色だけさらに選択肢が消えていきます。
同様のことがこの後も続きます。
f:id:emtubasa:20190708154112p:plain 例えば、先ほどの図から実はさらに頂点が存在していたとします。先ほど、青い頂点にいる際に、クリーム色の3つの頂点に色を塗りました。そして、今緑色の頂点に移動してきたとします。
緑色の頂点から行ける、親を除く頂点について色を塗ります(今回は水色の頂点になります)。
この場合も、水色から距離2以下の頂点のうち、すでに色が塗られているのは、今いる緑の頂点と、その親である青い頂点の2つのみになり、色塗り方は1番目の頂点がK-2、2番目がK-3、3番目がK-4通りとなります。

ということで、
DFSか何かで頂点を探索しつつ、今いる頂点から次に行くことができる頂点について、
 K - 2 - i ( ただしi0以上(次に行くことができる頂点数-1)以下の任意の数字 )
をかけていけばよいです。
が、一番最初の根はK通りであることと、そこから行ける頂点のみ、K - 1 - iであることに注意しなければなりません。
これを繰り返していけば、答えを求めることができます。

感想

この問題結構面白いと思いました。
コーナーケースに引っかからずに書けるようになりたいですね(今回はサンプルが合わないのでいいのですが…)

ABC133 D - Rain Flows into Dams

問題
提出コード

解法

i番目の山に降った雨の量をM_{i}とします。
すると、以下のような式が成り立ちます。
M_{1}/2 + M_{2}/2 = A_{1}
M_{2}/2 + M_{3}/2 = A_{2}
\vdots
M_{i}/2 + M_{i+1}/2 = A_{i}
\vdots
M_{N}/2 + M_{1}/2 = A_{N}
ということで、これらの式をまとめてM_{1}を求めることを考えてみます。
上の式から順番に、式1,2,...Nと名付けると、
式番号が奇数のものはそのまま、偶数のものには両辺に-1をかけてから、全てを足し合わせてあげます。すると、
(M_{1}/2 + M_{2}/2)-(M_{2}/2 + M_{3}/2)+(M_{1}/2 + M_{2}/2)...- -(M_{N-1}/2 + M_{N}/2) + (M_{N}/2 + M_{1}/2)
 = A_{1} - A_{2} + A_{3} - ... - A_{N-1} + A_{N}
となり、左辺をまとめると、
M_{1} = A_{1} - A_{2} + A_{3} - ... - A_{N-1} + A_{N}
となります。
よって、結局Aについて、正負を反転させつつ足し合わせていくだけでM_{1}を求めることができます。
そのほかの答えについては、最初の式に一つ一つ当てはめていけば良いです。

感想

この手の問題はとりあえず立式することが大事そうです。焦ってよくわからない方向に行きかけたのですが、今回は冷静に考え直すことができました。

ABC133 C - Remainder Minimization 2019

問題
提出コード

解法

基本的には、区間[L,R]から2つ数字i,jを選び、(i \times j) \ mod \  2019の最小値を求めていけばよいです。
が、このままだと_{R-L+1} C _{2} 回の計算が必要になってしまうので、この制約では間に合いません。
ここで、R-L+1の長さに注目すると、この長さが2019以上の際は、確実にi \  mod \  2019 0となるようなi区間の中に存在するはずです。
ということは、この数字を掛け算に利用することで、確実に(i \times j) \ mod  \ 20190にすることができます。
なので、結局

  • R-L+1が2019以上であれば答えは0

  • そうでなければ愚直に計算をして調べる

という操作を行ってあげればよいです。

ICPC2019模擬国内予選参加記

ICPC2019模擬国内予選に参加しました。
いろいろあって今年のチームメンバーは
Tsuzu君(@Wp120_3238)とmi_tesseract君(@mi_tesseract)です。
チーム名はCoprimEです。

コンテスト中の動き

ざっくりと…

開始直後

予定通り、自分がAを解き、残りの2人がB,C以降を読みました。
5分ぐらいでA問題を解き、自分も合流しました。
BをTsuzu君がやり、Cをmi君がやっていたのですが、とりあえずCはある程度いけそうな雰囲気で、Bは自分が慣れている系だったのでTsuzu君にDへ行ってもらい、バトンタッチ。 40分前後でACしました(intとboolを間違えてバグらせました)。
その後、Dは編集距離のDPをいじればよさそうとのことだったので、Cを飛ばしてDの実装へ行きました。自分はCへ合流しました。

開始から1時間程度

Cはコーナーケースが怖いが場合分けをすれば良さそうとのことだったので、Dの実装をいったん止めてCの実装をすることにしました。→WA。
(0,1)のコーナーケースがあったので、それを追加すると無事にAC。Tsuzu君に再びDの実装をしてもらい、僕とmi君でE以降を読むことになりました。

その後...

Dのサンプルがシンプルな実装だと合わず、無理やり合わせにいく形でサンプルを通しましたが、もちろんWA。
E~Hを読み、Eを解くことになりましたが、Eを3人でフローっぽい!と適当な決めつけをし、考察が明後日の方向に行きました。
結局、Dのコーナーケースと、それっぽい解法まではTsuzu君が思いついたので実装をしてもらったのですが、数分間に合いませんでした。
その解法自体は正解で、終了後他のチームのコードによるアウトプットとの一致を確認しました。

結果

3完で全体47位でした。今回は僕らのチームの上に2チームいたので、このままいくと予選落ちです…
jag-icpc.org

反省点

  • 声をかけられていない
    C以降のそれぞれの問題について、数人ずつで対応できたといえばできたのですが、それでもお互いが遠慮していたように思いました。
    最後、E問題の考察が終わっていないにも関わらず、実装を始めてしまった結果D問題が間に合わなくなってしまったので、もっと声を掛け合った方がいいのかなと思います。

  • 実力が足りない
    実力が足りません。DやEをすぱっと解けるようになりたいです。
    とりあえず国内予選までにできるところまで精進したいです。

結論

頑張ります(頑張ります)
目標は大学内で2位になり、無事に通過することです…

AOJ 2298 - Starting Line

問題
解法

解法

O(L)が間に合うことに注目すると、任意の距離1の区間[X-1,X]区間それぞれについて、速度uで走るかvで走るかを決めていけば良いです。
にんじんを食べるタイミングは貪欲に決めることができ、

  • 今スピードアップしてなければ拾ったタイミングで食べる

  • 今スピードアップしてれば、とりあえずキープをしておく

  • 今スピードアップしていてかつ、キープが満タンであれば、仕方なく食べる

の3択になります。
今いくつのにんじんをキープしているか、そしてスピードアップをしているならば、それが終わるのは距離がいくつの時か、を更新しながら、速度uで走る距離とvで走る距離を調べていけば、その距離をそれぞれの速度で割ったものの和によって答えが求まります。

感想

貪欲っぽい、というところからいろいろ迷走した結果とてつもない時間がかかってしまいました…
丁寧に調べることと、制約に注目することを忘れないようにしたいですね。

AOJ 2151 - 勇敢なお姫様またも現る

問題
提出コード

解法

頂点を増やします。
dis[i][j] = 都市iに着いた段階で予算のうちjだけ消費するような経路の中で、襲われる人数の最小値
とすると、今いる都市、消費した予算、襲われる人数を一緒に持った状態でダイクストラ法を適用すれば良いです。
次の都市に遷移する際に、予算を消費するか、消費せずに襲われる人数を増やすかの2択が発生するので、それぞれについての遷移を考えていけばいいことになります。

感想

最初、無条件で予算を消費しつつ襲われる人数をカウントしていく問題だと誤読したので、サンプルが全く合わずに混乱していました…
頂点を増やしてダイクストラを行う問題、やはり多いですね。

ABC131 D - Megalomania

問題
提出コード

解法

やることから先に言うと、
A_{i},B_{i}B_{i}の昇順でソートし、1 \leqq k \leqq Nを満たす任意のkについて、
\displaystyle \sum_{i=1}^{k}A_{i} \leqq B_{i}
が成立すれば答えがYesになり、1つでもこれが成立しなければNoになります。
結局、時刻B_{i}の時点では、締め切りがB_{i}以下の仕事については全て終えている必要があるので、それらにかかる時間の総和がB_{i}を超えているかどうかを調べればよいです。

感想

区間スケジューリングの典型的な問題をすこしひねったような問題に見えました。
区間スケジューリングが区間の後ろでソートしてうまく貪欲をしていくものだったことを考えると、この問題の方針が見えました。