codeforces 842C dp
来源:互联网 发布:软件本地数据库查找 编辑:程序博客网 时间:2024/06/03 05:44
题目大意:给你一棵树,树上的每一个节点有一个值,定义一个节点的美丽值为这个节点到根节点的的路径上的每一个个节点(包括自己)的所有的值的最大公约数,现在给定一种操作,对于某一个点的美丽值现在可以把路径上的任意一个点的值变为0,(规定GCD(x,0)=x)问对于每一个个点单独考虑,输出每一个点的美丽值的最大值。
思路:在大佬的帮助下明白了dp的思路,定义dp[i][0]表示从根节点到i已经有一个被改变为0的所有可能产生的公约数的集合,dp[i][1]表示从根节点到i没有节点被变为0的所有可能的公约数的集合,这里公约数的集合只可能是logn的级别,具体的原因我还不是很清楚。
那么很明显dp应该这样定义
转移很简单,这里就不写了,直接看代码
#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<string>#include<set>#include<map>#include<queue>#include<stack>#include<cstring>#define clr(x) memset(x,0,sizeof(x))using namespace std;#define LL long longint dat[200005];vector<int>vec[200005];int ans[200005];bool vis[200005];set<int>dp[200005][2];int gcd(int a,int b){ if(a==0||b==0)return max(a,b); return a%b==0?b:gcd(b,a%b);}void dfs(int now,int ma){ for(set<int>::iterator it = dp[now][0].begin();it!=dp[now][0].end();it++) { ans[now] = max(ans[now],*it); } for(set<int>::iterator it = dp[now][1].begin();it!=dp[now][1].end();it++) { ans[now] = max(ans[now],*it); } vis[now] = true; for(int i = 0;i<vec[now].size();i++) { if(vis[vec[now][i]])continue; for(set<int>::iterator it = dp[now][1].begin();it!=dp[now][1].end();it++) { int temp = gcd(*it,dat[vec[now][i]]); //cout << "k" << temp <<" " << *it <<vec[]<< endl; dp[vec[now][i]][0].insert(*it); dp[vec[now][i]][1].insert(temp); } for(set<int>::iterator it = dp[now][0].begin();it!=dp[now][0].end();it++) { int temp = gcd(*it,dat[vec[now][i]]); dp[vec[now][i]][0].insert(temp); //dp[vec[now][i]][1].insert(temp); } dfs(vec[now][i],ans[now]); }}int main(){ int n; while(scanf("%d",&n)!=EOF) { clr(vis); clr(ans); for(int i = 0;i<=n;i++) vec[i].clear(),dp[i][0].clear(),dp[i][1].clear(); for(int i = 1;i<=n;i++) scanf("%d",&dat[i]); for(int i = 0;i<n-1;i++) { int a,b; scanf("%d%d",&a,&b); vec[a].push_back(b); vec[b].push_back(a); } dp[1][1].insert(dat[1]); dp[1][0].insert(0); dfs(1,0); //for(set<int>::iterator it = dp[2][0].begin();it!=dp[2][0].end();it++)cout << *it <<" ";cout << endl; for(int i = 1;i<=n;i++) { if(i!=1)printf(" "); printf("%d",ans[i]); }printf("\n"); } return 0;}
阅读全文
0 0
- codeforces 842C dp
- CodeForces 467C DP
- Codeforces 156C (DP)
- codeforces 155C dp
- CodeForces 13C DP
- codeforces 431C DP
- CodeForces 687C【DP】
- Codeforces 706c dp
- CodeForces 13C【DP】
- CodeForces 761C 【DP】
- 【Codeforces 711 C】+ dp
- codeforces 754C dp
- CodeForces 106C 【DP】
- Codeforces 840C [DP]
- Codeforces 856C [DP]
- codeforces 255C DP yy
- codeforces 230C Shifts DP
- CodeForces 13C Sequence (DP)
- 网易2018笔试题三
- idea搭建ssm框架
- 学生信息管理系统
- LeetCode 520. Detect Capital 自己的解法
- VS2010调试-显示堆栈窗口
- codeforces 842C dp
- 错误: 找不到或无法加载主类 myeclipse maven
- Codeforces Round #430 (Div. 2) D. Vitya and Strange Lesson(01Trie)
- 图形与图像编程(二)-基础图像技术
- OSG HUD (渲染屏幕上贴图和写字)
- (原创题)非回文串 (数学)
- 配置文件中,字符串占位符替换
- gdb可以调试keil生成的可执行文件吗?
- 23种设计模式(1)-单例模式