点分治全RE求调
查看原帖
点分治全RE求调
556545
_anll_楼主2024/9/2 21:29

rt,一眼点分治后提交上去全RE,手上的Linux系统和似了没什么区别,windows下对拍也拍不出问题,故求助dalao,提前致谢orz

#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,ans,tt=1,head[N],num[N];
int rt,maxn,sum,siz[N];
int del[N],d[2],dep[N];
vector<int> vo;
void add_edge(int f,int l){
	edges[++tt]={l,head[f]};
	head[f]=tt;
}
void Findrt(int x,int fa){
	int an=0;siz[x]=1;
	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(maxn>an) maxn=an,rt=x;
}
void dfs(int x,int fa){
//	cout<<x<<endl;
	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);
	}
}
int calc(int x){
	del[x]=1;
	d[num[x]^1]=-1;
	for(int i=head[x];i;i=edges[i].nxt){
		int l=edges[i].l;if(del[l]) continue;
		dfs(l,0);
		for(int j=0;j<vo.size();j++)
			if(d[num[vo[j]]^1]!=-1) ans=max(d[num[vo[j]]^1]+dep[vo[j]],ans);
		for(int j=0;j<vo.size();j++)
			d[num[vo[j]]]=max(d[num[vo[j]]],dep[vo[j]]);
		vo.clear();
	}
	d[0]=d[1]=0;
}
void work(int x){
	calc(x);
	for(int i=head[x];i;i=edges[i].nxt){
		int l=edges[i].l;if(del[l]) continue;
		maxn=sum=siz[l];Findrt(l,0);work(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>>num[i];
	for(int i=1;i<n;i++){
		cin>>f>>l;
		add_edge(f,l);add_edge(l,f);
	}
	maxn=sum=n;Findrt(1,0);
	work(rt);
	cout<<ans;
	return 0;
}
2024/9/2 21:29
加载中...