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 #include <map>
  9 #include <list>
 10 #include <stack>
 11 #include <queue>
 12 #include <vector>
 13 #include <bitset>
 14 #include <ext/rope>
 15 #include <algorithm>
 16 #include <iostream>
 17 using namespace std;
 18 #define ll long long
 19 #define minv 1e-6
 20 #define inf 1e9
 21 #define pi 3.1415926536
 22 #define E  2.7182818284
 23 const ll mod=1e9+7;//998244353
 24 const int maxn=2e5+10;
 25
 26 struct node
 27 {
 28     int d;
 29     node* next;
 30 }*e[maxn];
 31
 32 set<int>y[maxn]; //delete one
 33 int a[maxn],x[maxn],value[maxn];
 34 bool vis[maxn]={0};
 35
 36 void dfs(int d)
 37 {
 38     set<int>::iterator i;
 39     int dd;
 40
 41     value[d]=x[d];
 42     for (i=y[d].begin();i!=y[d].end();i++)
 43         value[d]=max(value[d],*i);
 44
 45     node* p=e[d];
 46     vis[d]=1;
 47     while (p)
 48     {
 49         dd=p->d;
 50         if (!vis[dd])
 51         {
 52             x[dd]=__gcd(x[d],a[dd]);
 53             y[dd].insert(x[d]);
 54             for (i=y[d].begin();i!=y[d].end();i++)
 55                 y[dd].insert(__gcd(a[dd],*i));
 56             if (d==1)
 57                 y[dd].insert(a[dd]);
 58             dfs(dd);
 59         }
 60         p=p->next;
 61     }
 62     //free memory
 63     y[d].clear();
 64 }
 65
 66 int main()
 67 {
 68     node* p;
 69     int n,X,y,i;
 70     scanf("%d",&n);
 71     for (i=1;i<=n;i++)
 72         scanf("%d",&a[i]);
 73     for (i=1;i<n;i++)
 74     {
 75         scanf("%d%d",&X,&y);
 76         p=(node*) malloc (sizeof(node));
 77         p->d=y;
 78         p->next=e[X];
 79         e[X]=p;
 80
 81         p=(node*) malloc (sizeof(node));
 82         p->d=X;
 83         p->next=e[y];
 84         e[y]=p;
 85     }
 86
 87     x[1]=a[1];
 88     dfs(1);
 89
 90     for (i=1;i<n;i++)
 91         printf("%d ",value[i]);
 92     printf("%d",value[i]);
 93     return 0;
 94 }
 95 /*
 96 3
 97 6 10 12
 98 1 2
 99 2 3
100 */

原文地址:https://www.cnblogs.com/cmyg/p/9529971.html

时间: 2024-10-29 08:52:49

C - Ilya And The Tree Codeforces Round #430 (Div. 2)的相关文章

【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) 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[

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 #245 (Div. 1)——Guess the Tree

本文出自:http://blog.csdn.net/svitter 实验环境:Myeclipse10 + tomcat7.0 有时间会写windows和linux下的tomcat配置,现在时间有限,暂且不写了..有些东西也是没有理解透彻. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <%@ page language="java" contentType="

递推 Codeforces Round #186 (Div. 2) B. Ilya and Queries

题目传送门 1 /* 2 递推:用cnt记录前缀值,查询区间时,两个区间相减 3 */ 4 #include <cstdio> 5 #include <algorithm> 6 #include <cmath> 7 #include <cstring> 8 using namespace std; 9 10 const int MAXN = 1e5 + 10; 11 const int INF = 0x3f3f3f3f; 12 char s[MAXN]; 1

贪心 Codeforces Round #297 (Div. 2) C. Ilya and Sticks

题目传送门 1 /* 2 题意:给n个棍子,组成的矩形面积和最大,每根棍子可以-1 3 贪心:排序后,相邻的进行比较,若可以读入x[p++],然后两两相乘相加就可以了 4 */ 5 #include <cstdio> 6 #include <algorithm> 7 #include <cstring> 8 #include <cmath> 9 using namespace std; 10 11 typedef long long ll; 12 13 co

Codeforces Round #417 (Div. 2) E. Sagheer and Apple Tree(树上Nim)

题目链接:Codeforces Round #417 (Div. 2) E. Sagheer and Apple Tree 题意: 给你一棵树,每个节点有a[i]个苹果,有两个人要在这个树上玩游戏. 两个人轮流操作,谁不能操作谁就输了. 这个树有一个特性:叶子到根的距离的奇偶性相同. 每次操作可以选一个节点i,和一个数x,x小于当前节点i的苹果数. 对于节点i,如果是叶子节点,就将这x个苹果吃掉. 如果是非叶子节点,就将这x个苹果移向节点i的任意儿子节点. 现在第二个操作的人要交换两个节点的苹果

Codeforces Round #315 (Div. 1)

A. Primes or Palindromes? time limit per test 3 seconds memory limit per test 256 megabytes input standard input output standard output Rikhail Mubinchik believes that the current definition of prime numbers is obsolete as they are too complex and un