Codeforces 842C

来源:互联网 发布:淘宝夏宽 编辑:程序博客网 时间:2024/06/17 19:50

**【题意】

给出一棵生成树,每个节点都有一个值,现在要求出每个节点的美丽值的最大值,美丽值的定义为从根节点到该节点(包含)路径上所有点的值的gcd,求解每个点时可以把路径上某一个点的值变为0。你可以认为每个点美丽值的求解是独立的。**

别人的代码ac。。

#include <bits/stdc++.h>using namespace std;const int maxn=2e5;int n;int A[maxn+10],dp[maxn+10][2],fa[maxn+10];vector<int>g[maxn+10];set<int>s[maxn+10];void dfs(int v,int p,int b){    for(int w:s[p])s[v].insert(__gcd(w,A[v]));    s[v].insert(b);    b=__gcd(b,A[v]);    s[v].insert(b);    for(int w:g[v])if(w!=p)dfs(w,v,b);}int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)scanf("%d",A+i);    int u,v;    for(int i=1;i<n;i++){        scanf("%d%d",&u,&v);        g[u].push_back(v);        g[v].push_back(u);    }    dfs(1,0,0);    for(int i=1;i<=n;i++)        printf("%d ",*s[i].rbegin());    return 0;}

我的代码wa4

int val[N];const int maxn=2e5;int fst[N],nxt[N<<1],to[N<<1],e;vector<int>g[maxn+10];set<int>s[maxn+10];set<int>::iterator it;void dfs(int u,int fa,int c){    for(it=s[u].begin();it!=s[u].end();++it)s[u].insert(__gcd(*it,val[u]));    s[u].insert(c);    c=__gcd(c,val[u]);    s[u].insert(c);    for(int i=0;i<g[u].size();++i)if(g[u][i]!=fa)dfs(g[u][i],u,c);}int main(){    int n;sf("%d",&n);    mem(fst,-1);e=0;    rep(i,1,n)sf("%d",&val[i]);    rep(i,1,n-1){ int u,v;sf("%d%d",&u,&v);g[u].push_back(v);g[v].push_back(u);}    dfs(1,0,0);    rep(i,1,n)pf("%d%c",*s[i].rbegin(),i==n?'\n':' ');}

原本以为可以dp ,但其实是不可以的。。。谢谢提醒

int gcd(int a,int b){ if(b>a)swap(a,b);return b==0?a:gcd(b,a%b); }int dp[N][2],ans[N];void add(int u,int v){    to[e]=v;nxt[e]=fst[u];fst[u]=e++;}void dfs(int u,int fa){    dp[u][0]=gcd(dp[fa][0],val[u]);    dp[u][1]=max(dp[fa][0],gcd(dp[fa][1],val[u]));    ans[u]=max(dp[u][0],dp[u][1]);    for(int i=fst[u];~i;i=nxt[i]){        int v=to[i];        if(v==fa)continue;        dfs(v,u);    }}int main(){    int n;sf("%d",&n);    mem(fst,-1);e=0;    rep(i,1,n)sf("%d",&val[i]);    mem(dp,0);    rep(i,1,n-1){ int u,v;sf("%d%d",&u,&v);add(u,v);add(v,u); }    dp[1][0]=val[1];    dfs(1,1);    //rep(i,1,n)pf("%d %d\n",dp[i][0],dp[i][1]);    rep(i,1,n)pf("%d%c",ans[i],i==n?'\n':' ');}
原创粉丝点击