CodeForces Golbal Round 1
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\)
否則\(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\)
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