DFS1
,DFS2
,build
中的一个炸了,因为是在输入所有边之后立马 RE 掉。define
&include
:#include<cstdio>
#include<vector>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#define MAXN 100005
#define lson(o) (o<<1)
#define rson(o) (o<<1|1)
#define LL long long
using namespace std;
vector<LL>v[MAXN];
LL d[MAXN],fa[MAXN],sz[MAXN],rk[MAXN],hson[MAXN],dfn[MAXN],top[MAXN],val[MAXN],w[MAXN];
//d:节点深度;fa:父节点;sz:子树大小;rk:dfn序对应的节点编号;hson:重儿子;dfn:重链剖分后的顺序;top:链顶端;
//val:重链剖分之后节点的值;w:初始值
LL n,m,r,p;
DFS1
代码:LL DFS1(LL u,LL dep){
hson[u]=0;
sz[hson[u]]=0;
d[u]=dep;
sz[u]=1;
for(LL i=0,s=v[u].size();i<s;i++){
sz[u]+=DFS1(v[u][i],dep+1);
fa[v[u][i]]=u;
if(sz[v[u][i]]>sz[hson[u]]){
hson[u]=v[u][i];
}
}
return sz[u];
}
DFS2
代码:LL tot=0;
void DFS2(LL u,LL tp){
top[u]=tp;
tot++;
dfn[u]=tot;
val[tot]=w[u];
rk[tot]=u;
if(hson[u]!=0){
DFS2(hson[u],tp);
for(LL i=0,s=v[u].size();i<s;i++){
if(v[u][i]!=hson[u]){
DFS2(v[u][i],v[u][i]);
}
}
}
}
build
代码:inline void build(LL l,LL r,LL o){
plz[o]=0;
d[o]=0;
if(l==r){
d[o]=val[l];
return ;
}
LL mid=(l+r)>>1;
build(l,mid,lson(o));
build(mid+1,r,rson(o));
pushup(o);
}
int main(void){
scanf("%lld%lld%lld%lld",&n,&m,&r,&p);
for(int i=1;i<=n;i++){
LL vl;
scanf("%lld",&vl);
w[i]=vl;
}
for(int i=1;i<n;i++){
LL p,q;
scanf("%lld%lld",&p,&q);
v[p].push_back(q);
v[q].push_back(p);
}
DFS1(r,1);
DFS2(r,r);
tree.build(1,n,1);
while(m--){//后面就是各种操作
tree
是我封装的线段树结构体,里面有build
建树,change
区间修改,query
区间求和,以及一堆pushup
之类的函数。4 1
的时候,出现了一个zsh:segmentation
,(一般)也就是 RE。tree.build
,DFS1
,DFS2
出了问题?如果您觉得我太菜了,光凭这些代码根本看不出哪里有错,请移步完整代码。