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 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.
給出一棵生成樹,每個節點都有一個值,現在要求出每個節點的美麗值的最大值,美麗值的定義為從根節點到該節點(包含)路徑上所有點的值的gcd,求解每個 點時可以把路徑上某一個點的值變為0(就相當於刪除這個節點的數)。你可以認為每個點美麗值的求解是獨立的(每次刪除的點都不會影響下一次)。
InputFirst 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.
OutputOutput n numbers separated by spaces, where i-th number equals to maximum possible beauty of vertex i.
Examples Input2Output
6 2
1 2
6 6Input
3Output
6 2 3
1 2
1 3
6 6 6Input
1Output
10
10
我們用c[i]表示從1~i不變化的gcd值
用set[i]表示已變化的gcd的值的集合
對於u->v有
set[v].insert(c[u])表示將v變化
set[v][]=gcd(set[u][i],a[v])在v之前已變化
但這樣可能存在疑問,每一次的集合都增加一個,而且還要遍歷
這豈不是n^2???
但set去重後數量卻遠遠達不到n,也就√n
因為a[x]的因數總共就不超過√a[x]個,不可能超過這麽多,而a[x]<=20^5
所以可以過
輸出直接輸出集合中最大的數
代碼這裏用了STL中的集合
%%%%yzh巨佬用n^2暴力強行過:
http://www.cnblogs.com/Yuzao/p/7451552.html
果然巨佬還是強無敵啊
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<set> 6 using namespace std; 7 struct Node 8 { 9 int next,to; 10 }edge[400001]; 11 int num,head[200001],c[200001],a[200001],n; 12 set<int>Set[200001]; 13 void add(int u,int v) 14 { 15 num++; 16 edge[num].next=head[u]; 17 head[u]=num; 18 edge[num].to=v; 19 } 20 int gcd(int a,int b) 21 { 22 if (!b) return a; 23 return gcd(b,a%b); 24 } 25 void dfs(int x,int pa) 26 { 27 for (int i=head[x];i;i=edge[i].next) 28 { 29 int v=edge[i].to; 30 if (v==pa) continue; 31 c[v]=gcd(c[x],a[v]); 32 Set[v].insert(c[x]); 33 for (set<int>::iterator i=Set[x].begin();i!=Set[x].end();i++) 34 Set[v].insert(gcd(a[v],*i)); 35 dfs(v,x); 36 } 37 } 38 int main() 39 {int i,u,v; 40 cin>>n; 41 for (i=1;i<=n;i++) 42 { 43 scanf("%d",&a[i]); 44 } 45 for (i=1;i<=n-1;i++) 46 { 47 scanf("%d%d",&u,&v); 48 add(u,v);add(v,u); 49 } 50 c[1]=a[1]; 51 Set[1].insert(0); 52 dfs(1,0); 53 cout<<a[1]<<‘ ‘; 54 for (i=2;i<n;i++) 55 printf("%d ",*(--Set[i].end())); 56 if (n>1) 57 cout<<*(--Set[n].end())<<endl; 58 }
codeforces 842C Ilya And The Tree