开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));
}
}
}