萌新求助,刚学树剖1s
查看原帖
萌新求助,刚学树剖1s
149219
_mazetorches楼主2020/8/23 16:28

RT,样例错了

#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5+5;
int  n,m,r,a[maxn],tree[maxn<<2],tree1[maxn<<2],lazytag[maxn<<2];
int zhong[maxn],size[maxn],ceng[maxn];
int tot=0,st[maxn<<2],to[maxn<<2],nx[maxn<<2],fa[maxn];
int son[maxn];
int dfsxu,id[maxn],top[maxn],rk[maxn];
void add(int u,int v){
	to[++tot]=v;
	nx[tot]=st[u]; 
	st[u]=tot;
}
int ls(int p){
	return p<<1;
}
int rs(int p){
	return p<<1|1;
}
void push_up(int p){
	tree[p]=tree[ls(p)]+tree[rs(p)];
}
void dfs(int now,int father){
	int maxx=0;
	size[now]=1;
	for(int i=st[now];i;i=nx[i]){
		int v=to[i];
//		cout<<"%%% "<<now<<' '<<v<<endl;
//		cout<<"fa="<<fa[now]<<endl;
		if(father!=v){
			fa[v]=now;
//			cout<<"%%% "<<v<<' '<<fa[v]<<' '<<now<<endl;
			ceng[v]=ceng[now]+1;
			dfs(v,now);
			size[now]+=size[v];
			if(size[son[now]]<size[v]){
				maxx=size[v];
				son[now]=v;
			}
		}
	}
	return;
}
void dfs2(int now,int fokeyou){
	dfsxu++;
	id[now]=dfsxu;
	rk[dfsxu]=now;
	top[now]=fokeyou;
	if(son[now])dfs2(son[now],fokeyou);
	for(int i=st[now];i;i=nx[i]){
		int v=to[i];
		if(fa[now]!=v&&v!=son[now]){
			dfs2(v,v);
		}
	}
	return;
}
void build(int l,int r,int p){
	if(l==r){
		tree[p]=a[rk[l]];
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,ls(p));
	build(mid+1,r,rs(p));
	push_up(p);
}
void c(int l,int r,int p,int k){
	tree[k]=p*(r-l+1);
	lazytag[k]=p;
}
void push_down(int l,int r,int p,int k){
	int mid=(l+r)>>1;
	c(l,mid,p,ls(k));
	c(mid+1,r,p,rs(k));
	lazytag[k]=0;
}
void change(int l,int r,int fl,int fr,int p,int k){
	if(l>=fl&&r<=fr){
		tree[k]=p*(r-l+1);
		lazytag[k]=p;
		return ;
	}
	push_down(l,r,lazytag[k],k);
	int mid=(l+r)/2;
	if(fl<=mid)change(l,mid,fl,fr,p,ls(k));
	if(fr>mid){
		change(mid+1,r,fl,fr,p,rs(k));
	}
	push_up(k);
	return ;
}
int findhe(int l,int r,int fl,int fr,int k){
	if(l>=fl&&r<=fr){
		return tree[k];
	}
	push_down(l,r,lazytag[k],k);
	int mid=(l+r)>>1,ans=0;
	if(fl<=mid)ans+=findhe(l,mid,fl,fr,ls(k));
	if(fr>mid)ans+=findhe(mid+1,r,fl,fr,rs(k));
	return ans;
}
inline int qRange(int x,int y){
    int ans=0;
    while(top[x]!=top[y]){
        if(ceng[top[x]]<ceng[top[y]])swap(x,y);
        ans+=findhe(1,n,id[top[x]],id[x],1);
        x=fa[top[x]];
    }
    if(ceng[x]>ceng[y])swap(x,y);
    ans+=findhe(1,n,id[x],id[y],1);
    return ans;
}
inline void updRange(int x,int y,int k){
    while(top[x]!=top[y]){
        if(ceng[top[x]]<ceng[top[y]])swap(x,y);
        change(1,n,id[top[x]],id[x],k,1);
        x=fa[top[x]];
    }
    if(ceng[x]>ceng[y])swap(x,y);
    change(1,n,id[x],id[y],k,1);
}
inline int qSon(int x){
    return findhe(1,n,id[x],id[x]+size[x]-1,1);
}
inline void updSon(int x,int k){
    change(1,n,id[x],id[x]+size[x]-1,k,1);
}
signed main(){
	scanf("%d",&n);
	int u,v;
	for(int i=2;i<=n;i++){
		scanf("%d",&u);
		add(u+1,i);
		add(i,u+1);
	}
	string k;
	r=1;
	ceng[r]=1;
	fa[r]=r;
	dfs(r,0);
	dfs2(r,r);
	build(1,n,1);
	int l,r;
	cin>>m;
	for(int i=1;i<=m;i++){
		cin>>k;
		cin>>l;
		l++;
		int be=tree[1];
		if(k[0]=='i'){
			
			updRange(1,l,1);
//			cout<<"$$$";
			cout<<abs(tree[1]-be)<<endl;
		}
		else{
			updSon(l,0);
			cout<<abs(tree[1]-be)<<endl;
		}
	}
	return 0;
}
2020/8/23 16:28
加载中...