2021年8月2日 模擬賽
阿新 • • 發佈:2021-08-02
墊底了。
A. 吊燈
如果這棵樹能夠分割成 \(n/d\) 個大小為 \(d\) 的連通塊,那麼一定有 \(n/d\) 個子樹的 \(\mathrm{size}\) 是 \(d\) 的倍數。
證明的話,稱子樹 \(\mathrm{size}\) 是 \(d\) 的倍數的點為關鍵點,那麼根一定是關鍵點;其次,\(n\) 減去樹中的所有極大關鍵點(即祖先中除了根以外都不是關鍵點)的 \(\mathrm{size}\) 一定是 \(d\) 的倍數;又因為有 \(n/d\) 個關鍵點,那麼這個數恰好為 \(d\)。
所以 \(\mathcal O(\sqrt n)\)
比較卡常,不要顯式的建樹 dfs。
B. 小Z愛求和
在一般的情況下,一個數 \(x\) 產生貢獻的區間為 \([l,r]\) 內大於等於 \(x\) 的數恰好有 \(k\) 個的區間。
考慮先按照 \(a_i\) 排序,然後維護位置的集合,從小到大列舉 \(a_i\),在小於等於 \(a_i\) 的位置集合中找到所有長為 \(k\) 且包含 \(i\) 的連續段統計。
直接用 std::set<>
做是 \(\mathcal O(nk\log n)\) 的,倒著用連結串列可以降為 \(\mathcal O(nk)\)。
C. 關押罪犯
子集 DP。
D. 小P走迷宮
容斥。