树剖
树剖
【模板】重链剖分/树链剖分
树状数组模板
struct bit {
int c1[N], c2[N], mod;
int lb(int x) {
return x & (-x);
}
void add(int l, int r, int v) {
int p = 1ll * (l - 1) * v % mod, q = 1ll * r * v % mod;
for (int i = l; i <= n; i += lb(i)) {
c1[i] = (c1[i] + v) % mod;
c2[i] = (c2[i] + p) % mod;
}
for (int i = r + 1; i <= n; i += lb(i)) {
c1[i] = ((c1[i] - v) % mod + mod) % mod;
c2[i] = ((c2[i] - q) % mod + mod) % mod;
}
}
int find(int x) {
int res = 0;
for (int i = x; i; i -= lb(i))
res = (res + 1ll * c1[i] * x % mod - c2[i] + mod) % mod;
return res;
}
int find(int l, int r, int res = 0) {
res = (find(r) - find(l - 1) % mod);
return (res + mod) % mod;
}
} T;
Grass Planting G
树上路径加单点查询,注意边点权转换
Max Flow P
区间加 最后查询一次最大值
求和
多次查询路径权值 \(k\) 次方和
$k $ 不是很大,暴力维护即可!
Cow Land G
单点修改,多次查询路径权值异或和
树
单点打标记,多次询问某个结点最近的一个打了标记的祖先
线段树维护子树,向上跳的时候注意
月下“毛景树”
路径修改,路径加,路径最值
线段树维护即可
树的统计
同上!
魔法树
路径加,子树求和
Disruption P
对于每一个树边 \(u\) ,选择一个额外给出的边 \(v\) ,使 \(v\) 替换 \(u\) 后树联通,要求 \(w_v\) 最小
考虑额外的边 \((u, v)\) ,只会对树上 \(u\) 到 \(v\) 的路径做贡献
维护路径即可
软件包管理器
黑白染色,多次给定 \(u\)
-
染黑 \(u\) 及其子树
-
染白 \(u\) 及其祖先
线段树维护即可
染色
路径染色,多次询问路径颜色段数量
线段树维护,额外记录区间左右两边颜色
树上操作
单点加,子树加,查询 \(u\) 到根节点权值和
线段树维护即可
部落冲突
查询两点连通性,动态删边恢复边
线段树维护即可
Qtree1
单点修改,路径最值
线段树维护即可
Qtree3
黑白染色,单点修改,查询 \(u\) 到根节点的第一个黑点
线段树上二分即可
洛谷树
单点修改,查询路径及其所有子路径权值异或和
值域很小,多开几颗线段树找规律即可!
旅游
单点修改,路径取反,查询路径和、路径最值
线段树维护即可
GSS7 - Can you answer these queries VII
路径修改,多次询问路径最大字段和
线段树维护即可
好玩,爱玩!