3匹の猫

みみねこの競プロ精進メモ

AtCoder Beginner Contest 189参加記(~E問題)

DP回
100-200-0-400-500-0で0ペナ4完1200点。

A - Slot

C_1 = C_2C_2 = C_3が真なら、C_1 = C_3も真である。if文で判定すると解ける。

計算量は、O(1)

B - Alcoholic

i番目のお酒を飲んだ時のアルコールの摂取量は、V_i\times \dfrac{P_i}{100} ml で求められる。1番目からi番目までのお酒をすべて飲んだ時のアルコールの摂取量を計算していき、初めてXを超えたときのiが答えである。100で割ると誤差が出て怖いので、P_i100で割るかわりにX100倍すると整数のまま計算できる。

計算量は、O(N)

C - Mandarin Orange

解けなかった。いや、解けてたんだけど制約を見てO(N^2)解は通らないと判断して書かなかった(いいわけ)。

l, rを決めたとき、区間[l, r]の最小値をxとすれば、各皿ごとにx個のみかんを食べることができる。lを固定して考えたとき、rを増やしたときの最小値はx\gets \min (x, A_{r})で更新できる。すべてのl, rについて全探索して最大値を求めると、計算量はO(N^2)となる。

実はこの問題は「ヒストグラムの最大長方形」の面積を求める問題に帰着できて(というかそのまま)、DPを使うことでO(N)で解けるらしい。へ~

参考:
algorithms.blog55.fc2.com

D - Logical Expression

DP。
x_0 \land x_1 \lor x_2 ...x_Nという感じの式を考える(ただし前から順に評価していく)。i回目の計算が終わった時点での答えはTrueFalseのどちらかである。それぞれの答えとなるような変数の割り当て型の個数をそれぞれT_i, F_iとすると、i+1回目の計算が終わった時点での答えも計算できる。

計算量は、O(N)N\le 60は、答えがオーバーフローしないための制約らしい。

E - Rotate and Flip

とりあえず、点(x, y)を回転させたり線対称な位置に移動させたりする更新を式で表す。

  • 時計回りに90度回す

x\gets y
y\gets -x

  • 反時計回りに90度回す

x\gets -y
y\gets x

  • x=pを軸に対称移動させる

x\gets -x+2p
y\gets y

  • y=pを軸に対称移動させる

x\gets x
y\gets -y+2p


これらの式を眺めてみると、点の位置の更新は
x\gets Ax+By+C
y\gets Dx+Ey+F
という式で表せることがわかる。さらに、これらの更新する式は重ねることができる。(x, y)の更新をする式を関数f((x, y), A, B, C, D, E, F)と見ると、関数の合成f(f(A', B', C', D', E', F'), A, B, C, D, E, F)は次のように表せる。
x\gets A(A'x+B'y+C')+B(D'x+E'y+F')+C
y\gets D(A'x+B'y+C')+E(D'x+E'y+F')+F

式を整理して
x\gets (AA'+BD')x+(AB'+BE')y+C
y\gets (DA'+ED')x+(DB'+EE')y+F
とすれば、関数の合成をf(AA'+BD', AB'+BE', C, DA'+ED', DB'+EE', F)と一つの関数と見ることができる!(なげえ)

つまり、0回目の操作からi回目の操作までの関数の合成を累積和的な感じで計算しておけば、複数回の点の操作をO(1)で求めることができる。よって、各クエリにO(1)で答えることができる。

計算量は、O(N+M+Q)。入力を受け取るのがボトルネック

F - Sugoroku2

期待値、わからない

感想

簡単な処理なら10^8回の計算は1秒以内にできます