CF842C Ilya And The Tree
思路:
1. 如果根节点是0,那么可以通过一次dfs计算出所有节点的最大值。
2. 如果根节点不是0,那么其余各点的最大值一定是根节点的一个因子。首先计算出根节点的所有因子。在dfs到一个深度为d的节点v时,遍历所有因子:对于因子x,p表示从根节点到达v的路径中能够被x整除的节点个数。如果p >= d - 1,则x就是当前节点的一个候选最大值(d-1是因为可以把路径中其中一个数替换为0)。
于是通过两次dfs即可得出答案。复杂度O(n * sqrt(n))。在dfs的过程中,要注意维护全局变量。dfs到下一个分支时,要把上一个分支对全局变量造成的影响消除。
实现:
#include <bits/stdc++.h>
using namespace std;
int a[], val[];
vector<int> tree[];
int vis[];
int divisors[]; void dfs(int cur, int div)
{
vis[cur] = ;
for (int i = ; i < tree[cur].size(); i++)
{
int tmp = tree[cur][i];
if (vis[tmp]) continue;
val[tmp] = __gcd(div, a[tmp]);
dfs(tmp, val[tmp]);
}
} void dfs2(int cur, int d, vector<int>& v)
{
vis[cur] = ;
for (int i = ; i < tree[cur].size(); i++)
{
int tmp = tree[cur][i];
if (vis[tmp]) continue;
for (int j = ; j < v.size(); j++)
{
if (a[tmp] % v[j] == ) divisors[j]++;
if (divisors[j] >= d) val[tmp] = max(val[tmp], v[j]);
}
dfs2(tmp, d + , v);
for (int j = ; j < v.size(); j++)
if (a[tmp] % v[j] == ) divisors[j]--;
}
} int main()
{
int n, x, y;
while (cin >> n)
{
for (int i = ; i <= n; i++)
tree[i].clear();
for (int i = ; i <= n; i++)
cin >> a[i];
for (int i = ; i < n - ; i++)
{
cin >> x >> y;
tree[x].push_back(y);
tree[y].push_back(x);
}
int tmp = a[];
a[] = ;
memset(vis, , sizeof vis);
dfs(, );
a[] = val[] = tmp;
vector<int> v;
for (int i = ; i * i <= a[]; i++)
{
if (a[] % i == )
{
v.push_back(i);
if (a[] / i != i) v.push_back(a[] / i);
}
}
sort(v.begin(), v.end());
for (int i = ; i < v.size(); i++) divisors[i] = ;
memset(vis, , sizeof vis);
dfs2(, , v);
for (int i = ; i <= n; i++)
cout << val[i] << " ";
cout << endl;
}
return ;
}
CF842C Ilya And The Tree的更多相关文章
- 【cf842C】 Ilya And The Tree(dfs、枚举因子)
C. Ilya And The Tree 题意 给一棵树求每个点到根的路上允许修改一个为0,gcd的最大值. 题解 g是从根到当前点允许修改的最大gcd,gs为不修改的最大gcd.枚举当前点的因子,更 ...
- Codeforces Round #430 (Div. 2) C. Ilya And The Tree
地址:http://codeforces.com/contest/842/problem/C 题目: C. Ilya And The Tree time limit per test 2 second ...
- C. Ilya And The Tree 树形dp 暴力
C. Ilya And The Tree 写法还是比较容易想到,但是这么暴力的写法不是那么的敢写. 就直接枚举了每一个点上面的点的所有的情况,对于这个点不放进去特判一下,然后排序去重提高效率. 注意d ...
- codeforces 842C Ilya And The Tree
Ilya is very fond of graphs, especially trees. During his last trip to the forest Ilya found a very ...
- Codeforces Round #430 C. Ilya And The Tree
Ilya is very fond of graphs, especially trees. During his last trip to the forest Ilya found a very ...
- C - Ilya And The Tree Codeforces Round #430 (Div. 2)
http://codeforces.com/contest/842/problem/C 树 dp 一个数的质因数有限,用set存储,去重 #include <cstdio> #includ ...
- Codeforces 842C Ilya And The Tree 树上gcd
题目链接 题意 给定一棵根为\(1\)的树.定义每个点的美丽值为根节点到它的路径上所有点的\(gcd\)值.但是对于每个点,在计算它的美丽值时,可以将这条路径上某个点的值变为\(0\)来最大化它的美丽 ...
- Ilya And The Tree CodeForces - 842C
((半个)智商题,主要难度在于实现) 题意:有一棵n个结点组成的树,其根是编号为1的结点.对于每一个结点,生成从根结点走到这个结点的路径(包括自身),选择路径上的一个点或者不选择任何点,使得其它点的最 ...
- codeforces 842C Ilya And The Tree (01背包+dfs)
(点击此处查看原题) 题目分析 题意:在一个树中,有n个结点,记为 1~n ,其中根结点编号为1,每个结点都有一个值val[i],问从根结点到各个结点的路径中所有结点的值的gcd(最大公约数)最大是多 ...
随机推荐
- 洛谷 P2237 [USACO14FEB]自动完成Auto-complete
P2237 [USACO14FEB]自动完成Auto-complete 题目描述 Bessie the cow has a new cell phone and enjoys sending text ...
- 详细图解mongodb 3.4.1 win7x64安装
原文:http://www.cnblogs.com/yucongblog/p/6895983.html 详细图解,记录 win7 64 安装mongo数据库的过程.安装的版本是 MongoDB-win ...
- Maven项目中遇到的奇葩问题(续)
场景描写叙述 开发项目搞环境是一个很蛋疼的问题.总是会遇到各种奇葩的问题,上一篇文章http://blog.csdn.net/gao36951/article/details/50955526中遇到的 ...
- (linux shell)第一章--小试牛刀(下)
文章来源: (linux shell)第一章--小试牛刀(下) 1.6 数组和关联数组 1.6.1 预备知识 Bash同一时候支持普通数组和关联数组.普通数组仅仅能使用整数作为数组索引,而关联数组能够 ...
- bootstrap模态框出现或者消失的回调函数
当某一模态框出现的时候就触发函数: $(".modal").on('show.bs.modal',function(){ if(vueObj){...}else{//如果vue对象 ...
- qt-qml移动开发之在ios上开发和部署app流程简单介绍
qt5.3已经全面支持移动开发,除了mac,windows,linux.还支持ios,android,wp,meego等移动平台,本教程是作者依据自己的经验,从头讲怎么样在ios上公布自己的app.因 ...
- OBIEE开发手冊
Creating a Repository Using the Oracle BI 11g Administration Tool cid=5690&ssid=0">http: ...
- hdu1162
#include<cstdio> #include<cmath> #include<climits> #include<algorithm> #defi ...
- ios30---pthread, NSThread, GCD, NSOperation
pthread(线程库,很早就有的技术,了解):一套通用的多线程API适用于Unix\Linux\Windows等系统(java开发也有pthread)跨平台\可移植使用难度大(全是C函数) C语言 ...
- 关于hive
这两天在研究了hbase,hadoop,hive,spark 由于spark.py不支持clust(jar才支持,但是太麻烦了>_<) 所以最终决定使用hive 在hive中用create ...