Codeforces Round #430 (Div. 2) C. 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的路徑上的所有點權值的最大公約數,對於每個路徑上的點,你可以選擇唯一點將他變為0或者不做改變,現在希望你讓每個點都獲得儘可能大的魅力值,輸出每個點的魅力值
解題思路:這道題可以在dfs遍歷的時候,若是某個權值被修改,一定是這個權值的因子過小,導致這個路徑上的魅力值變小,那麼我們就列舉當前點的因子,判斷對於他的因子來說,是否在他之前的路徑中出現次數大於等於深度-2,若是超過,則說明這個因子肯定會存在,那麼就要這個因子,與x之前所有點gcd的值取max
深度-2的原因是,它意味著這個因子出現的次數僅僅在之前路徑上的某一個權值中不存在,若是這個因子很大,那麼我們就可以將這個權值變為0
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
typedef long long LL;
vector<int> tu[200005];
int b[200005],a[200005],check[200005],cnt[200005];
int n;
int gcd(int x, int y){
if(y == 0) return x;
else return gcd(y, x % y);
}
void dfs(int son,int fa,int deep)
{
int i,flag;
b[son]=gcd(a[son],b[fa]);
check[son]=b[fa];
for(i=1;i*i<=a[son];i++)
{
if(a[son]%i==0)
{
flag=i;
if(cnt[flag]>=deep-2) check[son]=max(flag,check[son]);
flag=a[son]/i;
if(cnt[flag]>=deep-2) check[son]=max(flag,check[son]);
if(i*i==a[son])
cnt[i]++;
else
cnt[i]++,cnt[a[son]/i]++;
}
}
for(i=0;i<tu[son].size();i++)
{
int k=tu[son][i];
if(k==fa)
continue;
dfs(k,son,deep+1);
}
for(i=1;i*i<=a[son];i++)
{
if(a[son]%i==0)
{
if(i*i==a[son])
cnt[i]--;
else
cnt[i]--,cnt[a[son]/i]--;
}
}
}
int main()
{
int x,y,i;
cin>>n;
for(i=1;i<=n;i++) cin>>a[i];
for(i=1;i<n;i++)
{
cin>>x>>y;
tu[x].push_back(y);
tu[y].push_back(x);
}
dfs(1,0,1);
for(i=1;i<=n;i++) cout<<check[i]<<" ";
cout<<endl;
}
相關推薦
Codeforces Round #430 (Div. 2) C. Ilya And The Tree(dfs+最大公約數+因子+樹)
C. Ilya And The Tree time limit per test 2 seconds memory limit per test 256 megabytes i
Codeforces Round #430 (Div. 2) C. Ilya And The Tree
C. Ilya And The Tree time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard output
【動態規劃】 Codeforces Round #416 (Div. 2) C. Vladik and Memorable Trip
and main spa def esp 動態 return 價值 can 劃分那個序列,沒必要完全覆蓋原序列。對於劃分出來的每個序列,對於某個值v,要麽全都在該序列,要麽全都不在該序列。 一個序列的價值是所有不同的值的異或和。整個的價值是所有劃分出來的序列的價值之和。
Codeforces Round #482 (Div. 2) C Kuro and Walking Route
any HA msu OS rom element res size false C. Kuro and Walking Route time limit per test 2 seconds memory limit per test 256 megabytes
Codeforces Round #292 (Div. 2) C. Drazil and Factorial 515C
note prope file ssi CI AC TP 最大值 NPU C. Drazil and Factorial time limit per test 2 seconds memory limit per test 256 megabytes inpu
(又FST在long long!!)Codeforces Round #293 (Div. 2)C. Anya and Smartphone
我的天,又FST在 long long piapiapia 扇死 題意:(我研究了半天才看懂) 第一行輸入應用總數 n ,要一次開啟應用的總數 ,每個螢幕最多的應用數。 第二行按位子(1~n)順序輸入應用的編號; 第三行輸入要依次開啟的應用。 問我們要求需
Codeforces Round #293 (Div. 2)D. Ilya and Escalator
這題目是算概率並不難 想了一會就有結果了, 程式碼是對的,可是因為用cout 格式要自己控制的 ,在WA了之後沒有想到,也是在比賽最後一點時間了,比賽結束時候就無語了 不過也好給我個教訓吧 題目連線 :http://codeforces.com/contest/518/problem/D 題
Codeforces Round #197 (Div. 2): C. Xenia and Weights(記憶化搜尋)
題意: 先輸入一個長度為10的01串,第i個數字為1表示你有重量為i的砝碼無數個,第i個數字為0表示你沒有重量為i的砝碼,你需要按照以下規則在一個一開始平衡的天平上放上m個砝碼 第1個砝碼放在天平左邊,第2個砝碼放在天平的右邊,第3個砝碼放在天平左邊……依次
【Codeforces Round #290 (Div. 2)-C. Fox And Names】 思維題+拓撲排序
Codeforces Round #290 (Div. 2)-C. Fox And Names 題意 給 你
Codeforces Round #524 (Div. 2) C. Masha and two friends 思路
題目:題目連結 思路:直接計數顯然是不好處理的,但分情況討論只要不寫錯這題是一定可以出的,但這樣基本做完這個題就沒時間做其他題了,但當時我就這麼蠢的這樣做了,比賽一個半小時的時候突然發現一個似乎可行的規律,但因為時間問題沒有證,當時那個思路已經快寫完了也沒有換思路寫,就杯具了,最後那個寫了一坨的程式碼耗了我
Codeforces Round #524 (Div. 2) C. Masha and two friends
C. Masha and two friends time limit per test 1 second memory limit per test 256 megabytes input standard input output standard outpu
Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task(數論構造)
思路來源 http://www.cnblogs.com/Dup4/p/10068891.html 題解 注意%可以起到等同於減的作用。 Solution1: 先給區間[1,n]加上一個較大的數D,比如500W, 這樣ai就變為D+ai, 由於ai-i<1
Codeforces Round #525 (Div. 2)C. Ehab and a 2-operation task
一個數 n-1 i++ 我們 text ++ target sin const C. Ehab and a 2-operation task 題目鏈接:https://codeforc.es/contest/1088/problem/C 題意: 給出n個數,然後最多可
Codeforces Round #525 (Div. 2) C. Ehab and a 2-operation task
題意: 給定一個長度為 n 的陣列a[ ],並且有兩種操作: ①將前 i 個數全都加上 x; ②將前 i 個數全都 mod x 要求用不超過 n+1 次操作,使得陣列 a[ ] 嚴格單調遞增。 思路: 對於每個數a[ i ],實施操作 a[ i ]%( a[ i ]-i
Codeforces Round #525 (Div. 2)C - Ehab and a 2-operation task
題目 題意: 給你長度為n的陣列a[i],最多操作n+1次,每次都可以將前 i 個數 (操作1)都加上x,或者(操作2)都%x ,(x為1e6以內的任意數,且每次操作可以不同), 使得陣列a嚴格單調遞增(一定後一項大於前一項)。 要你輸出一個總的
Codeforces Round #223 (Div. 2): C. Sereja and Prefixes(二分+遞迴)
題意: 你有一個序列,一開始為空,之後進行m次操作,操作有兩種: 1 x:在當前序列後面新增一個數x 2 x, y:將序列的前x個數複製y遍接序列後面(x<10000) 之後n次
Codeforces Round #356 (Div. 2) C. Bear and Prime 100 (有趣的題目)
C. Bear and Prime 100 time limit per test 1 second memory limit per test 256 megabytes input standard input output standard
Codeforces Round #524 (Div. 2)C. Masha and two friends(容斥定理)
傳送門 題意:先給出一個n行m列的矩陣,這個矩陣是黑白交錯的,左下角是白的,然後再給出一個矩陣,這個矩陣就全部染成白色的,之後再給出一個矩陣,這個矩陣染成黑色的,資料範圍是1e9,問最後白色塊和黑色塊分別由多少? 題解:首先可以算出這個大矩陣的黑色塊和白色塊分別有多少個,然後我們算下要染成白
Codeforces Round #416 (Div. 2) C Vladik and Memorable Trip
根據題目要求,目的地相同的人必須在一個車廂中,或者坐下趟車。因此,每個對人有兩種決策:(1)上車(2)不上車 上車就必須保證,所有該目的的人之間的乘客也必須上車,這樣中間的人同理,這個區間會不斷擴張,直到不會有區間外的人跟這個區間裡的某人目的地相同為止。剩下的區間又會變成子問題,記憶化求解即
Codeforces Round #355 (Div. 2) C Vanya and Label 快速冪取模
先預處理出每個字元可能的組合情況,然後 用map存各個字元出現的字數,最後快速冪一下就好了。。算是codeforces 裡面C題中比較簡單的一道了。。 #include<