树链剖分
穷源溯流
路很长,尽管走便是。
展开
-
洛谷 P4374 [USACO18OPEN]Disruption P(边树剖+思维)
题目难就难在对题意的转化,观察样例,1 2 3 构成一个环,4 5 6 也构成一个环,环上原有的路径可以被替换其中 2 3 这条边覆盖 1 2 3 节点,4 6 这条边覆盖 4 5 6 这三个节点,题目变成了求区间最小值const int N=5e4+5; int n,m; int i,j,k; int a[N]; vector<int> G[N]; struct Node { int l,r; ...原创 2021-03-03 20:07:08 · 146 阅读 · 1 评论 -
洛谷 P4427 [BJOI2018]求和(树剖)
由于题目多次使用求幂在累加求和的过程,所以现预处理 3e5以内的 50 次方,利用树剖可以解决问题,但是学要注意的是,题目以 1 作为根节点,所以 1 的深度为 0const int N=3e5+5; int n,m; int i,j,k; //int a[N]; int dp[N][50+5]; vector<int> G[N]; struct Node { int l,r; ...原创 2021-03-01 10:23:39 · 222 阅读 · 0 评论 -
洛谷 P4281 [AHOI2008]紧急集合 / 聚会(树剖+lca)
如果有两个点,那么最短的位置一定是两点中的 lca,此时有三个点,我们观察 6 3 1 这组询问,如上图所示:最后的答案为 2,也就是 3 6 的 lca,不妨可以猜测,最后的位置一定是在某两点的 lca 处,所以枚举即可代码并没有采用倍增,而是采用树剖来处理 lcaconst int N=5e5+5; int n,m; int i,j,k; int a[N]; vector<int> G[N];int dep[N],fa...原创 2021-02-27 10:10:15 · 238 阅读 · 0 评论 -
洛谷 P4114 Qtree1(边树剖)
const int N=1e5+5; int n,m; int i,j,k; int a[N]; struct Node { int l,r; int maxx; #define lson id<<1 #define rson id<<1|1 }t[N<<2]; struct Edge { int u,v,w; ...原创 2021-02-02 09:39:15 · 148 阅读 · 0 评论 -
洛谷 P4315 月下“毛景树”(边树剖)
题目不算难,但是代码量需要控制主要说一下线段树上的操作,因为有两个相关的区间操作标记,应该先覆盖后增加,因为覆盖操作会影响增加操作const int N=1e5+5; int n,m; int i,j,k; int a[N]; struct Node { int l,r; int maxx; int lazy,add; #define lson id<<1 ...原创 2021-01-28 15:11:14 · 176 阅读 · 0 评论 -
洛谷 P4116 Qtree3(树剖)
题目中默认根为 1,原创 2021-01-21 20:15:01 · 151 阅读 · 0 评论 -
洛谷 P4092 [HEOI2016/TJOI2016]树(树剖)
题目能够像过来还是挺简单的,但想不过来就……如何将标记操作与查询操作联系起来标记操作,一开始的时候所有节点都是 1,如果修改一个节点,那么将这个节点所代表的子树全部修改,完成 查询操作,从当前节点向根节点 1 查询不就好了吗,这样做好像不太对,如果所处的节点是左子树,那么可能查询到右子树上,但是如果我们单点查询的话,将标记下放至当前节点不就好了吗const int N=1e5+5; int n,m; int i,j,k; int a[N]; ...原创 2021-01-21 09:32:55 · 213 阅读 · 0 评论 -
洛谷 P3038 [USACO11DEC]Grass Planting G(边树剖)
题目描述Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional roads, such that there is exactly one path between any two pastures. Bessie, a cow who loves her grazing time, often complains about how there is no grass on t原创 2021-01-19 20:46:17 · 227 阅读 · 0 评论 -
洛谷 P3833 [SHOI2012]魔法树(树剖)
题目中只要注意平时在找重儿子的时候是以 s作为根节点 s>=1 所以在此根节点为 0,要求我们将所有的节点编号 +1const int N=1e5+5; int n,m; int i,j,k; int a[N]; vector<int> G[N]; struct Node { int l, r; ll lazy,sum; #define lson id<<1...原创 2021-01-19 16:48:00 · 168 阅读 · 0 评论 -
洛谷 P3384 【模板】轻重链剖分(树剖)
树剖模板题,有几个注意事项并没有默认根节点,所以在标重儿子以及标 dfs 序的时候应该注意两遍 dfs 的写法 统计以 x 为根的所有节点的情况,即求 [x,x+size[x]-1] 区间内的节点,size[x] 数组表示 x 节点所拥有的孩子的数量const int N=1e5+5; int n,m; int i,j,k; int a[N]; vector<int> G[N]; struct Node ...原创 2021-01-19 16:21:49 · 263 阅读 · 0 评论 -
洛谷 P3258 [JLOI2014]松鼠的新家(树链剖分)
题目要求熟练掌握树剖的概念,以及确定线段树的标号,题目应该不算难这 n 个点之间,每两点之间都加 1 ,这样只有最后一个点和第一个点没有做多余的操作,题目还要求最后一次到达终点时不用再拿糖果,所以除起点外其余点的权值减 1 记为最终答案。const int N=3e5+5; int i,j,k; int n,m; int a[N]; struct Node { int l,r; int sum,lazy; ...原创 2020-12-03 08:52:27 · 284 阅读 · 0 评论 -
POJ 3237 Tree(边树剖)
这个题比较难是因为,有一个区间取反操作,(好吧,还是我菜)求一个区间的最大值,若区间内所有的数都变成原来的负数形式,那么其最小值就成为了最大值还有一点就是在树剖中的点权变为了边权,因为这样,在单边修改的时候,要找对应边上深度较大的点(代码中的注释 1),在区间修改时,要忽略掉他们的 LCA ,因为在退出 while 循环后,x,y 两点跳到同一条重链上,深度最小的那个点就是 LCAconst int N=1e5+5; int n,m,t; int i,j,k;...原创 2020-10-11 10:20:31 · 225 阅读 · 0 评论 -
SPOJ 375 Query on a tree(边树剖)
有 n 个节点,n-1 条边,每一条边都有一个边权,现在求 在 [a,b] 节点上花费最大的边权,及将 第i 条边的权值变为权值c这个题和普通的树链剖分不同,由于每个节点只有一个父节点,但是有多个子节点,所以以子节点看作边求解(也可以将节点想象成一个区间,大概)和之前不同的是,再更新边权时,要找到深度最大的那个节点在查询边权时,由于第一次 deep 较大的 x 跳到了其父节点的位置上,那么下一次应该是从 fa[x]+1 上开始跳还要注意的是,有 t 组测试样例,重儿子啥的别...原创 2020-10-04 10:44:50 · 157 阅读 · 0 评论 -
DFS 序 2
const int N=1e6+5; int n,m,t; int i,j,k; int a[N]; vector<int> G[N<<1]; int s;int sz[N],son[N],dep[N],fa[N];void dfs1(int u,int f){ dep[u]=dep[f]+1; fa[u]=f; sz[u]=1; int len=G[u].size(); fo...原创 2020-10-03 10:47:41 · 365 阅读 · 0 评论 -
DFS 序 1
const int N=1e6+5; int n,m,t; int i,j,k; int a[N]; vector<int> G[N<<1]; int s;int sz[N],son[N],dep[N],fa[N];void dfs1(int u,int f){ dep[u]=dep[f]+1; fa[u]=f; sz[u]=1; int len=G[u].size(); ...原创 2020-10-03 10:37:41 · 235 阅读 · 0 评论 -
1562:「NOI2015」软件包管理器
可能洛谷上的题目描述更友好一些:https://www.luogu.com.cn/problem/P2146这个题和不同的树链剖分有一点不同,首先建图时考虑单向边其次利用 lazy 操作,分别计算安装 x 时需要在安装多少,因为可能不在同一条链上,所以利用述链剖分但是删除 x 时,一定在一条链上,所以直接在线段树上操作即可const int N=1e5+5; int n,m,t; int i,j,k; int a[N]; vector&l...原创 2020-10-01 21:27:56 · 317 阅读 · 0 评论 -
1561:「HAOI2015」树上操作
【输入样例】5 51 2 3 4 51 21 42 32 53 31 2 13 52 1 23 3【输出样例】6913const int N=2e5+5; int n,m,t; int i,j,k; int a[N]; vector<int> G[N<<1];int sz[N],son[N],fa[N],dep[N];void dfs1(int u,int f){ sz[u...原创 2020-10-01 11:21:31 · 418 阅读 · 0 评论 -
1560:树的统计
#pragma GCC optimize(2)#include <bits/stdc++.h>#include <iostream>#include <cmath>#include <cstdio>#include <algorithm>#include <cstring>#include <queue>#include <vector>#include <utility>#de.原创 2020-09-29 23:24:17 · 460 阅读 · 0 评论