給一棵 n (≤10^5) 節點的樹,每節點有顏色。m (≤10^5) 次查詢:詢問以 v 為根的子樹中,出現次數 ≥ k 的顏色有幾種。
cnt[color] 及其頻率桶 freq[x](有多少顏色出現 x 次)。sum_{i≥k} freq[i],用樹狀數組維護後綴和。O((n+m)√n log n)。freq[cnt] 和 freq[cnt±1] 變化。ans[k] = 出現次數 ≥ k 的顏色數。
ans[++cnt[c]]++ans[cnt[c]--]--O(1),總複雜度 O((n+m)√n)。map 或 unordered_map)。O(n log^2 n)(map 操作 log)。cnt[color] 維護當前保留子樹的顏色計數。log n。O(n log n),常數極小,是本題最優解法之一。| 方法 | 複雜度 | 特點 |
|---|---|---|
| 莫隊 + BIT | O((n+m)√n log n) | 通用區間查詢框架,代碼量大 |
| 莫隊優化 | O((n+m)√n) | 利用問題特性 O(1) 更新,工程友好 |
| 啟發式合併 | O(n log^2 n) | 自然適合子樹聚合,易擴展 |
| DSU on Tree | O(n log n) | 理論最優,輕重子樹策略精妙 |
實際比賽中,方法二和方法四是性價比最高的選擇。