SoundHound Inc. Programming Contest 2018 -Masters Tournament-

4完。なんでE解けないかなあ。レーティングは微増。コンテスト後のやる気のなさがすごい。

A - F

簡単なAは久しぶりな気がした。そこそこ面倒ではあるけど。Fって15のことか。

B - Acrostic

これもやるだけ。なんだ簡単回か〜?

C - Ordinary Beauty

と思わせてこれ。こういうの得意ではあるはずなんだけど、手こずってしまった。左から順に考えていくと、dがnに近い大きさでa[i]がn/2くらいのときa[i+1]との差はどうやってもdにならない。その範囲をきっちり求めるのが大変だった。いや明らかに簡単だけど大変だった。そしてDPみたくやっていこうとソースを書く。mがでかいので間に合わないが、途中までやればあとは変化しないだろうからいけるだろうと。だいぶ経ってから気づいたけど、dが小さいときも、両側に相手がある範囲というのがあって。それも計算した。んで書いてみるとどうもおかしい。方針がおかしいのではないか。なんか独立にやってもいいのでは。実際単純に足したらサンプル通った。本当に独立でいいのか頭の中で考え直してから提出。AC。
今になって振り返ると、全然理解してなかった。ていうか何やってたんだ俺は。正直、昨日は解説見ても全然ピンときてなかったし。本当に解説の通りとしか言いようがないんだけどね、わかんなかったね、昨日は。

D - Saving Snuuk

問題文が長いのでビビるけど、両替は1回だけ。年数が出てくるが、移動に年数はかからず、使える両替所の数はnから1まで変化する(端っこはn-1や0でない)。両替する場所を決めてしまえば、両側からダイクストラ法をやるだけの典型。しかし、両替所は閉鎖されるしn年ぶんの答えを得る必要があるし、そこが大変そう。
どうせ使う両替所は1つなんだから、各両替所についてそこを使った場合のスヌークの最大額を求めればいいのでは(ダイクストラをやっておけばO(1))。なんか最近やった問題のイメージが思い浮かぶ(なんだっけ)。値を更新していく。i年後のiが小さくなるほど状況は有利になるのだから、未来から順に良い両替所を更新していけばいい。

E - + Graph

最初は難しそうに思うが、例えばグラフが木だとして、1か所決めれば他も全部決まってしまう。木でなくとも二部グラフなら、ある頂点の数を1大きくすれば、違う側のは1小さく、同じ側のは1大きくなる。つまり二部グラフなら、適当に1つの頂点の数を決めて、それぞれの側の最大値だか最小値だかを見れば使える数の範囲がわかるはず。さて、二部グラフでない場合も0通りとは限らない。これが厄介そうだ。+1と-1が同時に襲ってくるから、あるとしても1通りだろう。解が見つかったとして、そこからある頂点を+Aすると、どこかでバッティングするときにA*2の差となって現れる。ならば、食い違ったときにその差の絶対値の半分だけずらして、初期値が1ならそれ以上小さいのはないので大きいほうへずらして、それでOKか調べればいい。と思ったけどWAだった。あんだけ複雑に書けばWAが出るのが自然と思ったが、根本的に解けてない可能性もある。1時間あったしこれは通したかったね。
(追記)ようやくAC。偶閉路のチェックをしていなかった。テストケースのoddLoop.txtとoddLoop_0.txtでWAになっていたのだが、本当に奇閉路を含んでいるの?二部グラフだったらREになるような提出をしたらREになっていた。