1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| #include<bits/stdc++.h> using namespace std; using ll=long long; #define rep(i,a,n) for(int i=a;i<=n;i++) #define frep(i,a,n) for(int i=a;i>=n;i--) #define int long long const int N=1e5+100; int dp[N][2];
vector<int>edge[N];
int a[N];
void dfs(int u,int fa) { for(auto v:edge[u]) { if(v==fa) { continue; } dfs(v,u); dp[u][0]+=max(dp[v][0],dp[v][1]); } for(auto v:edge[u]) { if(v==fa) { continue; } int sum=a[u]*a[v]; int t=sqrt(sum); if(t*t==sum) { dp[u][1]=max(dp[u][1],dp[v][0]+2+dp[u][0]-max(dp[v][0],dp[v][1])); } } } signed main() {
int n; cin>>n; rep(i,1,n) { cin>>a[i]; } rep(i,1,n-1) { int x,y; cin>>x>>y; edge[x].push_back(y); edge[y].push_back(x); } dfs(1,0); cout<<max(dp[1][1],dp[1][0]); return 0; }
|