TLE40分代码求调
查看原帖
TLE40分代码求调
586932
White_Wat楼主2024/7/2 17:14
#include<bits/stdc++.h>

using namespace std;

const int N = 100010;

int n,q;
vector<int> g[N];
int dep[N],siz[N],f[N],wc[N];
void dfs1(int u,int fa){
	f[u]=fa,siz[u]=1,dep[u]=dep[fa]+1;
	for(auto v:g[u]){
		if(v==fa) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[wc[u]]>siz[v]) wc[u]=v;
	}
}
int top[N],tottime,dfn[N];
void dfs2(int u,int TOP){
	dfn[u]=++tottime;
	top[u]=TOP;
	if(wc[u]) dfs2(wc[u],TOP);
	for(auto v:g[u]){
		if(v==f[u]||v==wc[u]) continue;
		dfs2(v,v);
	}
}
int sum[N<<2],laz[N<<2];
void update(int l,int r,int s,int t,int p,int c){
	if(l<=s&&t<=r){
		sum[p]=(t-s+1)*c;
		laz[p]=c;
		return ;
	}
	int mid=(s+t)>>1,ls=p*2,rs=p*2+1;
	if(laz[p]!=-1){
		sum[ls]=(mid-s+1)*laz[p],laz[ls]=laz[p];
		sum[rs]=(t-mid)*laz[p],laz[rs]=laz[p];
		laz[p]=-1;
	}
	if(l<=mid) update(l,r,s,mid,p*2,c);
	if(r>mid) update(l,r,mid+1,t,p*2+1,c);
	sum[p]=sum[p*2]+sum[p*2+1];
}
int get_sum(int l,int r,int s,int t,int p){
	if(l<=s&&t<=r){
		return sum[p];
	}
	int mid=(s+t)>>1,ls=p*2,rs=p*2+1;
	if(laz[p]!=-1){
		sum[ls]=(mid-s+1)*laz[p],laz[ls]=laz[p];
		sum[rs]=(t-mid)*laz[p],laz[rs]=laz[p];
		laz[p]=-1;
	}
	int re=0;
	if(l<=mid) re=get_sum(l,r,s,mid,p*2);
	if(r>mid) re+=get_sum(l,r,mid+1,t,p*2+1);
	return re;
}

int main(){
	scanf("%d",&n);
	for(int i=2;i<=n;i++){
		int x;
		scanf("%d",&x);
		x++;
		g[x].push_back(i),g[i].push_back(x);
	}
	dfs1(1,0);
	dfs2(1,1);
	memset(laz,-1,sizeof laz);
	scanf("%d",&q);
	while(q--){
		string opt;
		int x;
		cin>>opt;
		scanf("%d",&x);
		x++;
		if(opt=="uninstall"){
			printf("%d\n",get_sum(dfn[x],dfn[x]+siz[x]-1,1,n,1));
			update(dfn[x],dfn[x]+siz[x]-1,1,n,1,0);
		}
		else{
			int re=dep[x];
			while(x){
				re-=get_sum(dfn[top[x]],dfn[x],1,n,1);
				update(dfn[top[x]],dfn[x],1,n,1,1);
				x=f[top[x]];
			}
			printf("%d\n",re);
		}
	}
	return 0;
}
2024/7/2 17:14
加载中...