Codeforces Round #430 (Div. 2) C

题意:一棵树,问每个点到1节点这条链的所有数字的gcd,可删除某个数,每个链单独处理

思路:暴力存,可删除重复的,可百度unique的具体用法

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=2e5+10;
 4
 5 int a[N],dp[N],b[N];
 6 vector<int > e[N],g[N];
 7
 8 void dfs(int u,int fa){
 9     for(int i=0;i<e[u].size();i++){
10         int v=e[u][i];
11         if(v==fa) continue ;
12         dp[v]=__gcd(dp[u],a[v]);
13         g[v].push_back(dp[u]);
14         for(int j=0;j<g[u].size();j++)
15             g[v].push_back(__gcd(g[u][j],a[v]));
16         sort(g[v].begin(),g[v].end());
17         g[v].erase(unique(g[v].begin(),g[v].end()),g[v].end());
18         dfs(v,u);
19     }
20 }
21
22 int main(){
23     int n;
24     scanf("%d",&n);
25     for(int i=1;i<=n;i++){
26         scanf("%d",&a[i]);
27     }
28     for(int i=1;i<n;i++){
29         int x,y;
30         scanf("%d%d",&x,&y);
31         e[x].push_back(y);
32         e[y].push_back(x);
33     }
34     dp[1]=a[1];
35     g[1].push_back(0);
36     dfs(1,0);
37     for(int i=1;i<=n;i++){
38         b[i]=dp[i];
39         if(!g[i].empty()){
40             b[i]=max(b[i],g[i].back());
41         }
42         printf("%d ",b[i]);
43     }
44     printf("\n");
45 }
时间: 2024-08-05 15:18:30

Codeforces Round #430 (Div. 2) C的相关文章

C - Ilya And The Tree Codeforces Round #430 (Div. 2)

http://codeforces.com/contest/842/problem/C 树 dp 一个数的质因数有限,用set存储,去重 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 #include <time.h> 6 #include <string> 7 #include <set> 8 #inc

【Codeforces Round #430 (Div. 2) A C D三个题】

·不论难度,A,C,D自己都有收获! [A. Kirill And The Game] ·全是英文题,述大意:    给出两组区间端点:l,r,x,y和一个k.(都是正整数,保证区间不为空),询问是否在[x,y]区间内存在一个整数p,使得p*k属于[l,r],如果存在,则输出'YES',否则输出'NO'.(1<=l,r,x,y<=107) ·分析:     首先看见了107,发现可以直接O(n)暴力枚举:枚举区间[x,y]的所有数,判断它与k的乘积是否在[l,r]中就可以了.从容AC:    

Codeforces Round #430 (Div. 2) A

题意:给你药水经验的区间和成本的区间,问是否有一个比例完全==k 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=1e5+10; 5 6 double l,r,x,y,k; 7 int main(){ 8 scanf("%lf%lf%lf%lf%lf",&l,&r,&x,&y,&k); 9 for(int i=

Codeforces Round #430 (Div. 2)

题意:给出一个圆环,问有多少个圆完全在内环和外环之间 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=1e5+10; 5 6 7 int main(){ 8 int r,d; 9 cin>>r>>d; 10 int n; 11 cin>>n; 12 d=r-d; 13 int x,y,r1; 14 int sum=0; 15 for(

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd

Codeforces Round #273 (Div. 2)

Codeforces Round #273 (Div. 2) 题目链接 A:签到,仅仅要推断总和是不是5的倍数就可以,注意推断0的情况 B:最大值的情况是每一个集合先放1个,剩下都丢到一个集合去,最小值是尽量平均去分 C:假如3种球从小到大是a, b, c,那么假设(a + b) 2 <= c这个比較明显答案就是a + b了.由于c肯定要剩余了,假设(a + b)2 > c的话,就肯定能构造出最优的(a + b + c) / 3,由于肯定能够先拿a和b去消除c,而且控制a和b成2倍关系或者消除