zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    代码互改
    第一次个人编程作业
    第一次博客
    个人总结
    第三次个人作业--用例图设计
    第二次结对作业
    第一次结对作业
    记录浏览他人代码
    中文编程作业
    第一篇随笔
  • 原文地址:https://www.cnblogs.com/Noevon/p/7460427.html
Copyright © 2011-2022 走看看