求求大佬帮忙看下图的遍历
查看原帖
求求大佬帮忙看下图的遍历
67618
haooo楼主2021/2/24 11:02

RT,我的代码TlE了6060分。经过了查错,我发现我有些点的dfnsiz00。说明我的没有遍历完图(可能也会有其他问题),但我找不到是哪写错了。

#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;
}
2021/2/24 11:02
加载中...