Codeforces 842C Ilya And The Tree【Dfs】
Ilya is very fond of graphs, especially trees. During his last trip to the forest Ilya found a very interesting tree rooted at vertex 1. There is an integer number written on each vertex of the tree; the number written on vertex i is equal to ai.
Ilya believes that the beauty of the vertex x is the greatest common divisor of all numbers written on the vertices on the path from
the root to x
For each vertex the answer must be considered independently.
The beauty of the root equals to number written on it.
First line contains one integer number n — the number of vertices in tree (1 ≤ n ≤ 2·105).
Next line contains n integer numbers ai (1 ≤ i ≤ n, 1 ≤ ai ≤ 2·105).
Each of next n - 1 lines contains two integer numbers x and y (1 ≤ x, y ≤ n, x ≠ y), which means that there is an edge (x, y) in the tree.
Output n numbers separated by spaces, where i-th number equals to maximum possible beauty of vertex i.
Examples input2 6 2 1 2output
6 6input
3 6 2 3 1 2 1 3output
6 6 6input
1 10output
10
題目大意:
求從根節點1到每一個節點x路徑上的gcd最大值,我們可以用一次機會使得路徑上的某個數變成0.
思路:
爆搜+set去重即可。因為每個數的因子數最多為logn個,那麼對應一條路徑上的gcd的值也不會多。
Ac程式碼:
#include<stdio.h>
#include<string.h>
#include<vector>
#include<set>
using namespace std;
vector<int>mp[250000];
int ans[250000];
int a[250000];
int gcd(int x,int y)
{
return y==0?x:gcd(y,x%y);
}
void Dfs(int u,int from,set<int>now,int Val)
{
for(int i=0;i<mp[u].size();i++)
{
int v=mp[u][i];
if(v==from)continue;
set<int>nex;
nex.insert(Val);
set<int>::iterator it;
for(it=now.begin();it!=now.end();it++)
{
nex.insert(gcd(*it,a[v]));
}
ans[v]=max(ans[v],*nex.rbegin());
Dfs(v,u,nex,gcd(Val,a[v]));
}
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)mp[i].clear();
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n-1;i++)
{
int x,y;scanf("%d%d",&x,&y);
mp[x].push_back(y);
mp[y].push_back(x);
}
ans[1]=a[1];
set<int>temp;temp.clear();
temp.insert(a[1]);
temp.insert(0);
Dfs(1,-1,temp,a[1]);
for(int i=1;i<=n;i++)printf("%d ",ans[i]);
printf("\n");
}
}