RT,我的代码TlE了60分。经过了查错,我发现我有些点的dfn与siz为0。说明我的没有遍历完图(可能也会有其他问题),但我找不到是哪写错了。
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
template<typename T>
inline void read(T &x){
x=0;bool f=0;char ch=getchar();
while(ch<'0'||ch>'9'){f|=ch=='-';ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
x=f?-x:x;
}
template <typename T>
inline void print(T x){
if(x<0) putchar('-'),x=-x;
if(x>9) print(x/10);
putchar(x%10^48);
}
//Graph
struct Edge{
int nxt,to;
}edge[N]; int head[N],tnt;
inline void Add(int u,int v){edge[++tnt]=(Edge){head[u],v}; head[u]=tnt;}
//Chain Partition
int dnt;
int dfn[N],rev[N],son[N],fa[N],top[N],siz[N];
void Dfs1(int x,int f){
fa[x]=f;
siz[x]=1;
for(int i=head[x];i;i=edge[i].nxt){
int y=edge[i].to;
if(y==f) continue;
Dfs1(y,x);
siz[x]+=siz[y];
son[x]=siz[son[x]]>siz[y]?son[x]:y;
}
}
void Dfs2(int x,int f){
top[x]=x==son[f]?top[f]:x;
dfn[x]=++dnt,rev[dnt]=x;
if(son[x]) Dfs2(son[x],x);
for(int i=head[x];i;i=edge[i].nxt){
int y=edge[i].to;
if(y==f||y==son[x]) continue;
Dfs2(y,x);
}
}
//Segment Tree
struct SegTree{
int l,r,sum,flag;
#define l(x) t[x].l
#define r(x) t[x].r
#define sum(x) t[x].sum
#define flag(x) t[x].flag
}t[N*4];
inline void pushup(int p){sum(p)=sum(p<<1)+sum(p<<1|1);}
inline void pushdown(int p){
if(flag(p)!=-1){
flag(p<<1)=flag(p);
sum(p<<1)=(r(p<<1)-l(p<<1)+1)*flag(p);
flag(p<<1|1)=flag(p);
sum(p<<1|1)=(r(p<<1|1)-l(p<<1|1)+1)*flag(p);
flag(p)=-1;
}
}
void build(int p,int l,int r){
l(p)=l,r(p)=r;
if(l==r){
flag(p)=-1;
sum(p)=0;
return;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p);
}
void modify(int p,int l,int r,int d){
if(l<=l(p)&&r(p)<=r){
flag(p)=d;
sum(p)=(r(p)-l(p)+1)*d;
return;
}
pushdown(p);
int mid=(l(p)+r(p))>>1;
if(mid>=l) modify(p<<1,l,r,d);
if(mid<r) modify(p<<1|1,l,r,d);
pushup(p);
}
int ask(int p,int l,int r){
if(l<=l(p)&&r(p)<=r) return sum(p);
int mid=(l(p)+r(p))>>1;
int ans=0;
pushdown(p);
cout<<l(p)<<" "<<r(p)<<" "<<l<<" "<<r<<"\n";
if(l<=mid) ans+=ask(p<<1,l,r);
if(r>mid) ans+=ask(p<<1|1,l,r) ;
return ans;
}
int n,q;
int main(){
read(n);
for(int v=1;v<n;v++){
int u;read(u);
Add(u+1,v+1);
}
Dfs1(1,0);
Dfs2(1,0);
if(dnt!=n){
cout<<"我是sb\n";
for(int i=1;i<=n;i++){
if(dfn[i]==0)
print(i),putchar(' ');
}
return 0;
}
// for(int i=1;i<=n;i++){
// cout<<i<<" "<<top[i]<<" "<<siz[i]<<"\n";
// }
read(q);
build(1,1,n);
for(int i=1;i<=q;i++){
string op;int x;
cin>>op;read(x);x+=1;
if(op[0]=='u'){
// if(siz[x]+dfn[x]-1>n) return 0;
int res=ask(1,dfn[x],dfn[x]+siz[x]-1);
cout<<"#@4\n";
modify(1,dfn[x],dfn[x]+siz[x]-1,0);
// cout<<"uty";
print(res),puts("");
} else{
int res=0;
while(top[x]!=1){
res+=dfn[x]-dfn[top[x]]+1-ask(1,dfn[top[x]],dfn[x]);
modify(1,dfn[top[x]],dfn[x],1);
x=fa[top[x]];
}
res+=dfn[x]-ask(1,1,dfn[x]);
modify(1,1,dfn[x],1);
print(res),puts("");
}
}
return 0;
}