大家的都是厌氧,为什么我的是好氧?
查看原帖
大家的都是厌氧,为什么我的是好氧?
310773
PCCP楼主2023/3/9 15:17

开O2就A,不开就只有10分,有RE还有WA。其中WA的显示:

Wrong Answer.wrong answer Too long on line 100001.

请问有没有大佬能够解答一下蒟蒻的疑惑呢?

原码如下:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e6+10;
int n,m,a[N];
int he[N],ne[N<<1],to[N<<1],tot=1;
void addedge(int x,int y){
	to[++tot]=y;
	ne[tot]=he[x];
	he[x]=tot;
}
int dep[N],son[N],siz[N],top[N],fa[N],seq[N],dfo[N],cnt;
void dfs1(int x){
	dep[x]=dep[fa[x]]+1;
	siz[x]=1; 
	for(int i=he[x];i!=-1;i=ne[i]){
		int v=to[i];
		if(v==fa[x]){
			continue;
		}
		dfs1(v);
		siz[x]+=siz[v];
		if(siz[v]>siz[son[x]]){
			son[x]=v;
		}
	}
}
void dfs2(int x,int t){
	top[x]=t;
	dfo[x]=++cnt;
	seq[cnt]=x;
	if(!son[x]){
		return;
	}
	dfs2(son[x],t);
	for(int i=he[x];i!=-1;i=ne[i]){
		int v=to[i];
		if(v==fa[x]||v==son[x]){
			continue;
		}
		dfs2(v,v);
	}
}
struct node{
	int l,r,sum,la;
}tr[N<<2];
void pushup(int x){
	tr[x].sum=tr[x<<1].sum+tr[x<<1|1].sum;
}
void pushdown(int x){
	tr[x<<1].la=tr[x].la;
	tr[x<<1|1].la=tr[x].la;
	tr[x<<1].sum=(tr[x<<1].r-tr[x<<1].l+1)*tr[x].la;
	tr[x<<1|1].sum=(tr[x<<1|1].r-tr[x<<1|1].l+1)*tr[x].la;
	tr[x].la=-1;
}
void build(int x,int l,int r){
	tr[x].l=l;
	tr[x].r=r;
	if(l==r){
		tr[x].la=-1;
		return ;
	}
	int mid=(l+r)>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	pushup(x);
}
void change(int x,int l,int r,int k){
	if(l<=tr[x].l&&tr[x].r<=r){
		tr[x].sum=(tr[x].r-tr[x].l+1)*k;
		tr[x].la=k;
		return ;
	}
	if(tr[x].la!=-1){
		pushdown(x);
	}
	int mid=(tr[x].l+tr[x].r)>>1;
	if(l<=mid){
		change(x<<1,l,r,k);
	}
	if(r>mid){
		change(x<<1|1,l,r,k);
	}
	pushup(x);
}
int query(int x,int l,int r){
	if(l<=tr[x].l&&tr[x].r<=r){
		return tr[x].sum;
	}
	if(tr[x].la!=-1){
		pushdown(x);
	}
	int mid=(tr[x].r+tr[x].l)>>1,res=0;
	if(l<=mid){
		res+=query(x<<1,l,r);
	}
	if(r>mid){
		res+=query(x<<1|1,l,r);
	}
	pushup(x);
	return res;
}
int install(int x){
	int res=0;
	while(x){
		res+=(dfo[x]-dfo[top[x]]+1)-query(1,dfo[top[x]],dfo[x]);
		change(1,dfo[top[x]],dfo[x],1);
		x=fa[top[x]];
	}
	return res;
}
int uninstall(int x){
	int res=query(1,dfo[x],dfo[x]+siz[x]-1);
	change(1,dfo[x],dfo[x]+siz[x]-1,0);
	return res;
}
signed main(){
	scanf("%d",&n);
	char s[10];
	int k;
	memset(he,-1,sizeof he);
	for(int i=2;i<=n;i++){
		scanf("%d",&fa[i]);
		fa[i]++;
		addedge(fa[i],i);
		addedge(i,fa[i]);
	}
	dfs1(1);
	dfs2(1,1);
	build(1,1,n);
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%s",s+1);
		if(s[1]=='i'){
			scanf("%d",&k);
			k++;
			printf("%d\n",install(k));
		}
		if(s[1]=='u'){
			scanf("%d",&k);
			k++;
			printf("%d\n",uninstall(k));
		}
	}
}
2023/3/9 15:17
加载中...