1. 程式人生 > >CodeForces Golbal Round 1

CodeForces Golbal Round 1

差分 round 葉子節點 def 容易 for 條件 ref 距離

CodeForces Golbal Round 1

CF新的比賽呢(雖然沒啥區別)!這種報名的人多的比賽漲分是真的快。。。。
所以就寫下題解吧。

A. Parity

太簡單了,隨便模擬一下就完了。

B. Tape

顯然就是先找一個長的把所有的全部覆蓋,然後可以在上面丟掉\(k-1\)段間隙。
那麽把兩兩之間的間隙長度拿出來排序就可以了。

C. Meaningless Operations

如果\(a\)不等於\(2^k-1\)的形式,那麽令\(S=2^k-1\),其中\(2^{k-1}<a<2^k\)
那麽令\(b=S\oplus a\),那麽\(a\oplus b=S,a\&b=0\)

,那麽此時的\(gcd=S\),為最大值。

否則\(a=S\),那麽\(gcd=gcd(a-b,b)\),這是一個輾轉相減的形式,等於\(gcd(a,b)\),所以\(b\)\(a\)的最大的不等於\(a\)的約數。

D. Jongmah

顯然對於\(i\)而言只可能和\(i-2,i-1,i+1,i+2\)湊順子。
而如果某個順子超過了\(3\)個是沒有意義的,所以一個順子最多出現\(2\)次,所以\(i\)這個牌最多用\(6\)次,超過\(6\)的部分每\(3\)個直接湊起來。
那麽設\(f[i][0..6][0..6]\)表示當前考慮的是\(i\),後面兩維記錄\(i-1\)的數量和\(i-2\)

的數量。
轉移的時候枚舉這個順子的出現次數,隨便轉移一下就好了。

E. Magic Stones

\(\mbox{agc006_c}\)很類似啊。
觀察這個數列的操作,把它差分,發現差分後的操作等價於在差分數組上交換相鄰兩個數。
所以只需要判斷兩個數列的差分數組排序後是否相等即可。
註意要特判第一個數是否相等。

F. Nearest Leaf

考慮兩個點之間的距離是\(dep[u]+dep[v]-2*dep[LCA]\)
那麽我們把所有葉子節點的\(dep[u]\)放在自己身上。對於一個詢問\(u\),顯然就是找最小的\(dep[v]-2*dep[LCA]\)\(dfs\)整棵樹,假如當前點作為\(LCA\)

影響其子樹內的詢問,那麽就是把它子樹內的所有點權全部減去\(2*dep[u]\),這樣子詢問的時候,直接查區間最小值即可。線段樹維護。

G. Tree-Tac-Toe

有神仙已經寫得很好了,所以我就懶得寫了
註意一下別每次\(memset\),每次手動\(for\)清空數組。

H. Modest Substrings

如果滿足條件的串很少的話,顯然全部丟到\(AC\)自動機裏面去\(dp\)
問題就在於這樣子符合條件的串很多。
考慮壓縮狀態,不難發現很多自動機上的狀態都是滿的,即可以隨意選擇子串都能匹配上。
什麽樣的點的子樹是滿的呢?對於\(\ge l\)而言,符合了前綴之後,下一位大於\(l\)的這一位的所有節點。對於\(\le r\)是類似的。
那麽一共有\(\Sigma(|l|+|r|)\)個滿狀態的節點,註意\(\Sigma\)是字符集大小。
對於每個滿狀態的節點,設\(g[u][x]\)表示從\(u\)節點開始,往下任意走\(x\)步,能夠到達的合法的串的個數,這個東西在構建\(AC\)自動機的時候可以很容易的得到。
那麽直接\(dp\)就好了。。。。
說不清所以看代碼吧。。。。
代碼

CodeForces Golbal Round 1