CodeForces Global 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\)就好了。。。。
說不清所以看代碼吧。。。。
代碼
