1. 程式人生 > 其它 >Atcoder做題總結

Atcoder做題總結

ARC058C

發現 \(x+y+z\) 最多隻有 \(17\) ,考慮狀壓,狀態中第 \(i\) 位表示是否可以得到和為 \(i\) 的字尾。
注意一下每個位置是放 \(1\) ~ \(10\) 而非 \(0\) ~ \(9\)

ARC133D

區間異或和不好搞,差分一下設 \(w_i = XOR_{k=1}^i k\)
容易發現規律: \(w_{4x}=4x\) , \(w_{4x+1}=1\) , \(w_{4x+2}=4x+3\) , \(w_{4x+3}=0\)
於是就可以快速計算了。

ARC129D

\(a_i\) 是在 \(i\) 處的操作次數,則有

\[2a_i - a_{i-1} - a_{i+1} = -A_i \]

注意到這個形式類似差分,所以設 \(b\)

\(a\) 的差分,由上述式子可以得到 \(b_2\) ~ \(b_n\) ,又因為 \(\sum b_i=0\) 可以算出 \(b_1\) ,接下來找一個最小的 \(a_1\) ,使所有 \(a_i\) 都非負即可。

ARC130F

有些許噁心。
跟“魚戲團表演”可以說是非常相似了。
觀察題目性質,當操作次數趨於無窮時,最後的結果會像是一個凸包的形式。
如果只是這樣就沒有什麼噁心的地方了,直接求凸包算就行。
但是!
問題在於題目是取整的,這就導致了得到的結果實際上應該是折線。
對於“凸包”上的兩個點,如何算他們之間的貢獻呢?
很容易犯的錯誤是直接把直線畫出來,然後對每個點下取整。
我們發現的問題在於,“下取整”這一操作會使直線發生改變,從而影響後面的答案。
稍微玩一下就能確定算貢獻的過程,如果區間是 \((l,r)\)

,且 \(a_l < a_r\) ,就應該從 \(l\) 開始向右一個一個求貢獻, \(f_i\) 應該由 \(f_{i-1}\)\(f_r\) 得到,而非 \(f_{l}\)\(f_r\)
正因為這一奇特的求貢獻方式,我們要求的“凸包”長歪了。
聯絡題目性質,知道求凸包時斜率應下取整