Codeforces 1338 题解
A
對于每個 \(i\) 我們求出 \(b_i\) 表示 \(i\) 這個數最少要增加多少(\(\max^i_{j=1}a_j-a_i\)),答案等于最小的 \(k\) 使得 \(2^k-1\ge \max^n_{i=1}b_i\).
時間復雜度 \(O(n)\).
代碼: 76336034
B
最小:只要存在兩個葉子距離為奇數,答案就是 \(3\),否則是 \(1\).
最大:等于非葉子節點數加上和至少一個葉子節點相連的非葉子節點數 \(-1\)。顯然和同一個點相連的葉子邊權必須相等。那么考慮去掉葉子節點后剩下的樹,由于你可以安排任意大的數,所以一定能做到邊權互不相同。
時間復雜度 \(O(n)\).
代碼: 76352259
C
找規律即可。打表前 \(16\) 位不難發現就是先四進制分解,由 \(\mod 3\) 的值得到答案的最高位,剩下的每一位做個置換。
歸納證明應該不難。
聽說這個規律還和 nim 積有關。
時間復雜度 \(O(\log n)\).
代碼: 76377989
D
我的做法還是找規律(然而腦速太慢賽后搞了一上午)。找規律的過程非常麻煩,實在不太會講,直接說一下結論好了:
設 \(f[u][0/1]\) 表示 \(u\) 點的子樹內,被根包含/不被根包含的最大層數。需要 \(0/1\) 是因為把根套在外面之后,僅僅能套住那些不被根的兒子包含的圈,而需要和根的兒子相交。這也就意味著,一個子樹的狀態可以表示為兩個相交的圈,其中較大的一個是根,另外一個不是根。
假設 \(u\) 有若干兒子 \(v_1,v_2,...,v_{sonn[u]}\). 那么最優方案一定會套成如下所示,藍色的是 \(u\),黑色和紅色分別是每個兒子的根 (\(0\)) 和非根 (\(1\)).
于是可以得到這樣的方程:
再考慮 \(f[u][0]\) 的轉移,顯然有
\[f[u][0]=\max_i f[v_i][1]+1 \]換根 dp 即可。
時間復雜度 \(O(n)\).
比較有道理的做法見 \(\color{black}{\text{s}}\color{red}{\text{uwakow}}\) 神仙的題解: https://www.cnblogs.com/suwakow/p/12692393.html
代碼: 76449398
E
題解: https://www.cnblogs.com/suncongbo/p/12779107.html
總結
以上是生活随笔為你收集整理的Codeforces 1338 题解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Codeforces 1336E Chi
- 下一篇: 【学习笔记】关于正整数除法下取整和上取整