妹子刚学 WA hack#2 求条
查看原帖
妹子刚学 WA hack#2 求条
556545
_anll_楼主2024/7/22 12:01

rt,在测评机上看是 WA,但样例下下来之后在 windows 环境下莫名其妙会挂掉,检查之后发现是在 dfs1 就挂了,于是万分不解求大佬指点 QAQ!

#include<vector>
#include<iostream>
#define int long long
using namespace std;
const int N=1e5+5;
struct Edge{
	int l,nxt;
}edges[N<<1];
int n,tt=1,head[N],tr[N],anu[N];
int rt,sum,maxn,siz[N],del[N];
int du[N],son[N],dep[N];
vector<int> vo;
void add_edge(int f,int l){
	edges[++tt]={l,head[f]};
	head[f]=tt;
}
int lowbit(int x){return x&-x;}
void add(int x,int k){
	for(;x<=2*n;x+=lowbit(x)) tr[x]+=k;
}
int Find(int x,int k=0){
	for(;x;x-=lowbit(x)) k+=tr[x];
	return k;
}
void dfs1(int x,int fa){
	for(int i=head[x];i;i=edges[i].nxt){
		int l=edges[i].l;if(l==fa) continue;
		dfs1(l,x);son[x]=min(son[x],son[l]+1);
	}
}
void dfs2(int x,int fa){
	for(int i=head[x];i;i=edges[i].nxt){
		int l=edges[i].l;if(l==fa) continue;
		son[l]=min(son[l],son[x]+1);dfs2(l,x);
	}
}
void Findrt(int x,int fa){
	siz[x]=1;int an=0;
	for(int i=head[x];i;i=edges[i].nxt){
		int l=edges[i].l;
		if(l==fa||del[l]) continue;
		Findrt(l,x);siz[x]+=siz[l];
		an=max(an,siz[l]);
	}
	an=max(an,sum-siz[x]);
	if(an<maxn) maxn=an,rt=x;
}
void dfs(int x,int fa){
	vo.push_back(x);dep[x]=dep[fa]+1;
	for(int i=head[x];i;i=edges[i].nxt){
		int l=edges[i].l;
		if(l==fa||del[l]) continue;
		dfs(l,x);
	}
}
void calc(int x,int tot){
	dep[0]=(tot==1?-1:0);dfs(x,0);
	for(int i=0;i<vo.size();i++){
		int l=vo[i];
		add(son[l]-dep[l]+n,tot*(2-du[l]));
	}
	for(int i=0;i<vo.size();i++){
		int l=vo[i];
		add(son[l]-dep[l]+n,-tot*(2-du[l]));
		anu[l]+=Find(dep[l]+n);
//		cout<<l<<"&&&"<<anu[l]<<endl;
		add(son[l]-dep[l]+n,tot*(2-du[l]));
	}
	for(int i=0;i<vo.size();i++){
		int l=vo[i];
		add(son[l]-dep[l]+n,-tot*(2-du[l]));
	}
	vo.clear();
}
void solve(int x){
	del[x]=1;calc(x,1);
	for(int i=head[x];i;i=edges[i].nxt){
		int l=edges[i].l;if(del[l]) continue;
		calc(l,-1);
		sum=maxn=siz[l];rt=l;
		Findrt(l,x);solve(rt);
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n;int f,l;
	for(int i=1;i<n;i++){
		cin>>f>>l;du[f]++,du[l]++;
		add_edge(f,l);add_edge(l,f);
	}
	for(int i=1;i<=n;i++) son[i]=(du[i]==1?0:2147483647);
	dfs1(1,0);dfs2(1,0);
	sum=maxn=n;rt=1;Findrt(1,0);solve(rt);
	for(int i=1;i<=n;i++) cout<<((!son[i])?1:anu[i])<<endl;
	return 0;
}
2024/7/22 12:01
加载中...