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