WA_TLE’s diary

競プロたのしい!

PCK2018よせん解説

解説を!!!するぞ!!! 難易度よそう 1?2?3<<4<<6<5,7,8<9,11<10<<<<<<(エアーズロック3個分)<<<<12

1~3本当にみてない。まあ適当にやって。

ではひどいので、相方が解説を書いてくれました。ありがとう!🙂http://kubokubokun.hatenablog.com/entry/2018/09/20/151529

4 ボトルを買うやつ

if文を頑張るのだが、工夫すると単純でバグりにくい。
変数名確認、aが1Lの値段、,bが500mLの値段、xミリリットル必要 だよね、解法はこうなる
x= (x+499)/500; //500で割って繰り上げしている
a=min(a,b *2); //これでa一本よりb二本が安いなら自動的にそうしている
if(x%2==0){cout<<a * (x/2) <<endl;}//端数がない
else{cout<<a*(x/2)+b<<endl;}//B端数がある

5 でぅーどにー数

解は ,ある自然数zに対し、zのn乗の形になるので、zを全探索。するとO( 108 のn乗根 * 桁和を求めるlog ) なので、2<=nの条件により高速に解ける

6 ぼぞそーと

ソート済みの配列といくつ一致しているか持っておいて、それがnになったときがこたえ。

7 ワープ装置

星に入るのか装置に入るのかでinとoutがこんがりませんか?
各文字cについて、それまでcに入るのが何通り?でdp。典型。

8 たくしー

条件を整理すると、こうなる
乗せる客を選ぶ。ただし各i 1<=i<=nに対して、i番目以下の乗り場の合計には、i人以下しか載せられない。
この条件に変形したら、優先キューで低い人を自明においだすだけ。

9 直線状の点

これなぜか苦労した。点を固定して、同じ傾きを通る点がほかにK-1個ありますか?を既約分数とunordered_mapで確認した。
n<=3000で、O(n2)でunordered_map,こわくないですか?こわいね(一応5秒ぐらいあったはず).

10 ダンジョン2

ダンジョン2、JOIにも全く同じ問題名がある。問題になりすぎでは?
とりあえず通った場所は部分木、辺を通った回数は、それがスタートとゴールの間のパスなら1度、else 2度
それを変形をして、スコア=Σ(各部屋のスコア-2) + スタートtoゴールのパスの長さ +2にする。

解法 木dpをする。dp[a]=aの部分木でスタートとゴールが木の子の中にない
ep[a]=スタートゴールのパスの片方だけが子に含まれる場合の、dp[a]に対するスコアのボーナス
fp[a]=スタートゴールのパスの両方が子に含まれる場合の、dp[a]に対するスコアのボーナス
さいしょの提出ではfpがなくて、WAした。 おばか。(当社比)

11 円盤

操作がセグ木に乗ります。ではあまりにひどいので解説します。
まず見ると、flipした状態では通常に比べて操作が反対向きになる。
よって、struct sousa{bool flip;long long int rota;};を考える、flipはそのままの意味、rotaはその数だけ回転するということ。
ただし、回転させてからflipをすることにする。
すると、sousa L,R,X;があって、XにはLをしてからR を乗せるとする。すると
X.flip= L.flip ^ R.flip;
if(L.flip){X.rota= L.rota+R.rota;}else{X.rota=L.rota-R.rota;}
とすると、操作の合成ができる。これをセグ木に乗せて、出てきたものを適当に円盤の場所に対応させて完成。

12

PCKにおいて、予選最後にHL分解がくるの、去年もだった。
実装が重すぎて50分ではとてもとけない。さよなら~