【做题记录】Codeforces做题记录
最近決定寫一些CF Div.1的題,練習一下速度和代碼能力。
暫定從中考后的Codeforces Round #572開始。
大部分比較簡單的題直接把題解寫在這里,不單獨開文章了。
Codeforces Round #572 (Div. 1)
Codeforces Round #573 (Div. 1)
Codeforces Global Round 4
Codeforces Round #576 (Div. 1)
A
省略
B
省略
Codeforces Round #580 (Div. 1)
B
顯然若某一位上有\(3\)個數,那么就會形成環,答案為\(3\). 因此該圖點數不超過\(2\log A\le 120\), 邊數也是\(O(\log A)\)級別。
然后就要求一個新圖的最短環,這個可以枚舉環上的一條邊,然后刪掉這條邊,求兩端點的最短路。
時間復雜度\(O(n+\log^2 A\log\log A)\)
代碼: 59195761
C
題解: https://www.cnblogs.com/suncongbo/p/11389254.html
Codeforces Round #583 (Div. 1 + Div. 2)
Codeforces Round #584 (Div. 1 + Div. 2)
E
原問題可以轉化為,每列輪換后每行選一個數,使得總和最大。
設\(dp[i][S]\)表示前\(i\)列已選的行的集合是\(S\), 枚舉輪換狀態進行轉移。提前求出這一行每個子集在所有輪換中的和的最大值即可得到一個時間復雜度為\(O((3^n+2^nn^2)m)\)的算法,可以通過E1題。
有個性質是只有按列最大值從大到小排序后的前\(n\)個列是有用的,因此只需考慮前\(n\)列。
時間復雜度\(O(3^nn+2^nn^3+nm+m\log m)\)
代碼: 60827873
Codeforces Round #586 (Div. 1 + Div. 2)
E
以起點為根建DFS樹,對于所有子樹內沒有任何一條返祖邊指向子樹外的子樹,我們無法獲得它內部的點權,但是可以獲得其內部最大權垂直鏈的點權,而其他點的點權都可以獲得,因此答案就是所有這種子樹的內部最大權垂直鏈的最大值加上其余點的點權和。
時間復雜度\(O(n)\).
代碼: 60831008
Codeforces Round #588 (Div. 1)
Codeforces Round #591 (Div. 1)
Codeforces Global Round 5
A
省略
B
省略
C
考慮二維怎么做: 按\(x\)排序,把每個\(x\)的點兩兩配對,消到只剩最多一個。然后相鄰的配對,顯然不會有相交。
三維就先按\(z\)排序,對每個二維平面執行二維算法,消到只剩最多一個。然后相鄰的配對,顯然也不會有交。
時間復雜度\(O(n\log n)\).
代碼: 62854906
D
顯然答案要么全是\(-1\), 要么全都不超過\(3n\). 將數組復制\(3\)倍,預處理\(r_i\)表示第\(i\)個點后面第一個小于其一半的位置,則某個點能延伸到的最遠點就是上述數組的后綴最小值,減去該點的原始位置就是答案。
也可以對每個點二分然后用數據結構實現。
時間復雜度\(O(n\log n)\).
代碼: 62725216
E
樹的形態是一棵滿二叉樹下面掛若干個兒子,且要求每個點的左兒子的右兒子大小為奇數,右兒子的左兒子大小為偶數。那么考慮在兩棵深度相同的樹上加一個根合并起來,右兒子的左端點個數奇偶性會限制右兒子最左邊的鏈上左兒子的有無,歸納易證只有左兒子最左邊的鏈上兒子可有可無,其余的方案是確定的,答案一定為\(0\)或\(1\), 且對于一種深度,只有兩個相差\(1\)的\(n\)答案是\(1\).
考慮生成答案為\(1\)的集合,歸納可證每次將兩個數同時加上兩數中的偶數\(+1\),就可以得到下一層的兩個數。
時間復雜度\(O(\log n)\).
代碼: 62864619
Codeforces Round #594 (Div. 1)
Codeforces Round #596 (Div. 1)
A
顯然答案不超過\(\log n\). 枚舉答案,轉化為\(k\)個\(2\)的冪次和為\(n-ak\). 求出最少需要幾個(\(\text{bitcnt}(n-ak)\))和最多需要幾個(\(n-ak\)),若\(i\)介于兩數之間則可以。
時間復雜度\(O(\log n)\)或\(O(\log^2n)\).
代碼: 63769126
B
把一個數看作長度為\(10^5\)的數組,第\(i\)個位置若\(i\)不是質數則為\(0\), 否則為這個質數的冪次\(\mod k\). 將這個數組用\(m\)進制進行Hash并插入map中,在map中查詢其每一位取負后的Hash值。
時間復雜度\(O(n\sqrt n)\)或\(O(n\log n)\).
代碼: 63771856
C
某個位置的操作不會影響在它右下方的矩形。
設\(f[i][j]\)表示從\((1,1)\)到\((i,j)\)且在\((i,j)\)點由朝右轉向朝下的方案數,\(g[i][j]\)表示從\((1,1)\)到\((i,j)\)且在\((i,j)\)由朝下轉為朝右的方案數。
則有轉移方程: \(f[i][j]=\sum^{j-1}_{k=lf[i][j]}g[k][j], g[i][j]=\sum^{i-1}_{k=lg[i][j]}f[i][k]\), 其中\(lf[i][j]\)等于最大的\(k\)使得\(sumx[i][k+1]\le n-k\), \(sumx[i][j]\)是第\(i\)行\(j\)處的后綴和,\(lg\)同理。這兩個數組可以\(O(nm)\)雙指針預處理,前綴和優化DP即可。
更簡單的實現方式: 從后往前DP, 這樣無需處理\(lf\)和\(lg\), \(lf[i][j]\)直接等于\(m-sumx[j]-1\).
時間復雜度\(O(nm)\).
代碼: 63768042
D
題解: https://www.cnblogs.com/suncongbo/p/11768950.html
總結
以上是生活随笔為你收集整理的【做题记录】Codeforces做题记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ 4388 [JOI2012春季
- 下一篇: Codeforces 1246D/122