树剖

树剖

参考题单

【模板】重链剖分/树链剖分

树状数组模板

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

路径修改,多次询问路径最大字段和

线段树维护即可

posted @ 2024-11-26 19:02  afhuds  阅读(2)  评论(0编辑  收藏  举报