专栏文章
DFS序与树链剖分
算法·理论参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @minol981
- 此快照首次捕获于
- 2025/12/02 05:48 3 个月前
- 此快照最后确认于
- 2025/12/02 05:48 3 个月前
前言
作者因DFS写得太糖,导致此题调试4h,一节课就过去了
DFS序
这是老师ppt中对DFS的讲解,但这讲了跟讲了一样不包含树链的操作
我们对一棵树进行DFS,把刚搜到他的顺序计为 ,离开这个点时记为 。很容的知道以 为根的子树的 值都在 之间,所以就可以把子树问题转为区间问题,可以用树状数组、线段树来快速处理
下面给出代码:
下面给出代码:
1点修改子树查
CPPconst int N=1e6+10;
int in[N],out[N],tr[N],cnt=0,a[N];
int maxn=1e6;
vector<int> g[N];
void xg(int x,int z){
for(;x<=maxn;x+=x&-x){
tr[x]+=z;
}
}
int ask(int l,int r){
int ans=0;
for(;r>=1;r-=r&-r){
ans+=tr[r];
}
l--;
for(;l>=1;l-=l&-l){
ans-=tr[l];
}
return ans;
}
void dfs(int x){
cnt++;
in[x]=cnt;
for(int xx:g[x]){
dfs(xx);
}
out[x]=cnt;
}
2
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...