淀粉质板板题求调
查看原帖
淀粉质板板题求调
420692
Leonid楼主2023/11/15 21:51

wa on 11,比 ans 多了 1。

#include<bits/stdc++.h>

using namespace std;

#define ll long long
#define ull unsigned ll
#define i128 __int128
#define db double
#define ld long db

#define M 200005
#define N 100000005
#define mod 998244353
#define mod2 1222827239
#define base 51787
#define base2 38833
#define inf 1e9+7
#define dinf 1e15
#define linf 7e18
#define eps 1e-15
#define delta 0.99777

int n;
int a[M];
vector<int> g[M];

vector<int> p[M];

void work(int x,int id){
	for(int i=2;i*i<=x;++i){
		if(x%i==0){
			p[id].push_back(i);
			while(x%i==0) x/=i;
		}
	}
	if(x>1) p[id].push_back(x);
}

int rt,siz[M],maxn[M],dep[M];
int dd;
int sum;
bool vis[M];

void dfs1(int u,int f){
	siz[u]=1;
	maxn[u]=0;
	for(auto v:g[u]){
		if(v==f||vis[v]) continue;
		dfs1(v,u);
		maxn[u]=max(maxn[u],siz[v]);
		siz[u]+=siz[v]; 
	}
	maxn[u]=max(maxn[u],sum-siz[u]);
	if(maxn[u]<maxn[rt]) rt=u;
}

void dfs2(int u,int f,int G){
	if(a[u]%G) return;
	dd=max(dd,dep[u]);
	for(auto v:g[u]){
		if(v==f||vis[v]) continue;
		dep[v]=dep[u]+1;
		dfs2(v,u,G);
	}
}

int ans;

void dfz(int u,int f){
	vis[u]=1;
	int res=0;
	for(auto v:g[u]){
		if(v==f||vis[v]) continue;
		dep[v]=1;
		for(auto G:p[u]){
			dd=0;
			dfs2(v,u,G);
			ans=max(ans,res+dd+1);
			res=max(res,dd);
		}
	}
	for(auto v:g[u]){
		if(v==f||vis[v]) continue;
		sum=siz[v];
		rt=0;
		dfs1(v,u);
		dfs1(rt,0);
		dfz(rt,u);
	}
}

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%d",&a[i]),work(a[i],i);
	for(int i=1;i<n;++i){
		int u,v;
		scanf("%d %d",&u,&v);
		g[u].push_back(v);
		g[v].push_back(u);
	}
	rt=0;
	maxn[rt]=inf;
	sum=n;
	dfs1(1,0);
	dfs1(rt,0);
	dfz(rt,0);
	printf("%d\n",ans);
	return 0;
}
2023/11/15 21:51
加载中...