1. 程式人生 > 其它 >Agora開發者創業講堂丨第2期:創業初期如何進行技術選型與架構設計?

Agora開發者創業講堂丨第2期:創業初期如何進行技術選型與架構設計?

本題有兩種演算法,一種是 \(O(n \log^2 n)\) 樹套樹/cdq 分治演算法,一種是 \(O(n\sqrt{n})\) 莫隊與值域分塊演算法,這裡只講根號演算法。

這道題就是一個樹上數顏色問題,只是顏色被限定在一個區間。

如果你做過 P4396 [AHOI2013]作業,我相信你能一眼看出這道題的做法。

數顏色問題的根號演算法做法一般是莫隊,而這道題是樹上莫隊。

有一種方法就是我們在樹上莫隊的時候維護一棵線段樹,對於加刪操作而言我們線上段樹對應位置修改,線段樹中維護當前區間是否存在奇數個顏色,查詢時直接查即可。

這個做法的複雜度是 \(O(q \log n \sqrt{n}+q \log n)\)

的,會被 #7 卡 TLE。

發現修改操作複雜度 \(q \log n \sqrt{n}\) 遠大於查詢操作複雜度 \(q \log n\),因此我們需要考慮平衡一下這兩者。

因此我們可以採用值域分塊。

值域分塊有一個好處是 \(O(1)\) 修改 \(O(\sqrt{n})\) 查詢,而這可以平衡複雜度,使得修改操作和查詢操作都是 \(O(q\sqrt{n})\)

需要注意的是如果塊長不當,可能會被 #7 卡掉,這裡建議調成理論最優塊長 \(\dfrac{2n}{\sqrt{m}}\)\(2n\) 是因為尤拉序長為 \(2n\)),如果還不過就在這附近調塊長。

Code:GitHub CodeBase-of-Plozia CF1479D Odd Mineral Resource.cpp