Contest7519 - 线段树合并 & 静态链分治

less than 1 minute read

Published:

Contest

A 主要颜色

CF600E Lomsat gelral

经 典 老 题。

Method 0: 启发式合并 $O(n \log n)$

最简单的思路:给每个节点开值域哈希表,按正常的启发式合并(Small-To-Large Merging)做就行了,$O(n \log n)$。

ll mx[MAXN];  // 众数的出现次数
ll ans[MAXN]; // 众数之和

unordered_map<ll, ll> mp[MAXN];
void dfs(int u, int fa) {
    mp[u][c[u]] = 1;
    mx[u] = 1;
    ans[u] = c[u];
    for (auto v : G[u]) if (v != fa) {
        dfs(v, u);
        if (mp[v].size() > mp[u].size()) {
            swap(mp[u], mp[v]);
            mx[u] = mx[v];
            ans[u] = ans[v];
        }
        for (auto [col, cnt] : mp[v]) {
            mp[u][col] += cnt;
            if (mp[u][col] > mx[u]) {
                mx[u] = mp[u][col];
                ans[u] = col;
            } else if (mp[u][col] == mx[u])
                ans[u] += col;
        }
    }
}

Method 1: 线段树合并 $O(n \log n)$

借鉴上面的那一套方法。有的时候问题并非哈希表能够直接解决,需要用线段树,这个时候线段树合并(Segment Tree Merging)的 tech 就有用了。

https://zhuanlan.zhihu.com/p/575513452 https://mzhang2021.github.io/cp-blog/segtree-merging/

动态开点线段树(Sparse Segment Tree)

Method 2: 静态链分治 $O(n \log n)$

Heavy Light Decomposition

B

P3521 [POI 2011] ROT-Tree Rotations

C

P4556 [Vani有约会] 雨天的尾巴 /【模板】线段树合并

D

P3605 [USACO17JAN] Promotion Counting P