codeforce842c Ilya And The Tree

题意:一颗树(n<2e5),每个节点有点权(x<2e5),对于每一个点权,你可以变它或者它祖先的其中一个为0,求每一个点到根节点的gcd的最大值

题解:对于每一个点,可以把每一个存它到根节点的每一个数变为0的gcd,可以知道越往下面走,gcd的可能值就越少

#include <bits/stdc++.h>
#define ll long long
#define maxn 200100
using namespace std;
int a[maxn], g[maxn];
vector<int >G[maxn];
set<int >s[maxn];
int dfs(int x,int fax){
    g[x] = __gcd(a[x], g[fax]);
    s[x].insert(g[fax]);
    for(auto i:s[fax]){
        s[x].insert(__gcd(a[x], i));
    }
    for(int i=0;i<G[x].size();i++){
        int u = G[x][i];
        if(u == fax) continue;
        dfs(u, x);
    }
}
int main(){
    int n, aa, b;
    scanf("%d", &n);
    for(int i=1;i<=n;i++) scanf("%d", &a[i]);
    for(int i=0;i<n-1;i++){
        scanf("%d%d", &aa, &b);
        G[aa].push_back(b);
        G[b].push_back(aa);
    }
    s[0].insert(0);
    dfs(1,0);
    for(int i=1;i<=n;i++)
        cout<<*s[i].rbegin()<<" ";
    cout<<endl;
    return 0;
}

 

posted on 2017-08-31 20:46  2855669158  阅读(133)  评论(0编辑  收藏  举报

导航