ABC289 参加記

6完90:58 + 1ペナ 230位

GのCHT忘れすぎてて思い出すのに時間かかった

A flip

さすがにやるだけですね~、めっちゃ簡潔にする方法も言語によってはありそう

(AC 2:15)

 

B レ

むず、問題文をほんとうに信じ込むことでBでUnionFindを使うことになりました

まあD問題と思えばいいだけなので、UnionFindして後ろからたどっていきます

(AC 6:22)

 

C Coverage

そういえば久しぶりのbit全探索ですね

考察自体はほとんどなく...

(AC 9:12)

 

D Step Up Robot

前回のDとの温度差よ

ほんとうにDPやるだけでした、これなら最短回数求めさせてもよさそうだけどね

(AC 13:31)

 

E Swap Places

これも過去に類題があるので考察もあんまりしなかった

F - Construct a Palindrome

 

上の問題を考えると、(高橋くんの位置、青木君の位置)をペアとした頂点をN^2個つくり、そこでBFSをすればいいことがわかります

辺もそんなに貼らなくてよさそうなので信じて投げると通ります

マルチテストケースなのに、初期化を忘れて1ペナ...

(AC 28:02)

 

F Teleporter Takahashi

順位表で全然解かれていない&無限にペナを出しそうな見た目をしていたので避けました

こういうの時間内で解くの大変だよね

(AC --:--)

 

G Shopping in AtCoder store

解けそうな見た目しているので考えます

まずBをソートしても問題ないので、ソートしておきます

とりあえず全員に買ってもらうとすると、(B[1] + C[j]) × N円得ることができます

その状態から、i人分諦めたとしてどうなるか差分を考えてみましょう

諦めた人のぶん(B[1] + C[j]) × iはマイナスになります

一方で、N-i人はまだ買ってもらえるので、(B[i] - B[1]) × (N-i)だけプラスになります

 

よって、i人分諦めたときに「全員買ってもらう」状態からどのくらい得するか?は

(B[i] - B[1]) × (N-i) - (B[1] + C[j]) × iで表されます

ここで、jが関連しているのはC[j]×iの部分だけであることが分かります

つまり、Bを用いる部分は使いまわすことができます

 

ざっくりした式を考えると、(Bから計算できるもの) - C[j]×iになって、これを最大化すればよいです

複数の一次関数から最大化するこの形の問題は、CHT(Convex Hull Trick)で解けることが知られているので、それぞれの一次関数をあらかじめ計算してあげて、CHTでクエリに答えるとよいです

(AC 90:58)

 

総括

7完安定しない