1. 程式人生 > 其它 >2021年8月2日 模擬賽

2021年8月2日 模擬賽

墊底了。

A. 吊燈

原題 P2351 SDOI2012 吊燈

如果這棵樹能夠分割成 \(n/d\) 個大小為 \(d\) 的連通塊,那麼一定有 \(n/d\) 個子樹的 \(\mathrm{size}\)\(d\) 的倍數。

證明的話,稱子樹 \(\mathrm{size}\)\(d\) 的倍數的點為關鍵點,那麼根一定是關鍵點;其次,\(n\) 減去樹中的所有極大關鍵點(即祖先中除了根以外都不是關鍵點)的 \(\mathrm{size}\) 一定是 \(d\) 的倍數;又因為有 \(n/d\) 個關鍵點,那麼這個數恰好為 \(d\)

所以 \(\mathcal O(\sqrt n)\)

列舉約數即可。

比較卡常,不要顯式的建樹 dfs。

submission

B. 小Z愛求和

link

在一般的情況下,一個數 \(x\) 產生貢獻的區間為 \([l,r]\) 內大於等於 \(x\) 的數恰好有 \(k\) 個的區間。

考慮先按照 \(a_i\) 排序,然後維護位置的集合,從小到大列舉 \(a_i\),在小於等於 \(a_i\) 的位置集合中找到所有長為 \(k\) 且包含 \(i\) 的連續段統計。

直接用 std::set<> 做是 \(\mathcal O(nk\log n)\) 的,倒著用連結串列可以降為 \(\mathcal O(nk)\)

submission

C. 關押罪犯

link

子集 DP。

submission

D. 小P走迷宮

link

容斥。

submission