Codeforces 842C--Ilya And The Tree(dfs+树)
原题链接:http://codeforces.com/contest/842/problem/C
题意:一个以1为根节点的树,每个节点有一个值ai,定义美丽度:从根节点到这个节点的路径上所有ai的gcd,即gcd(a1,a2,a5...ai),对每个节点的美丽度,我们可以使根到这个节点的路径上一个点的ai值变为0。求所有点的最大美丽度。
思路:先求出没有节点变为0的情况g[i],在此基础上,如果使x节点变为0,那么它的美丽度为父节点的g[i];假设让其他在路径上的点变为0,可以知道x节点的最大美丽度是a[x]的因子,因此我们只要枚举a[x]的因子,如果这个因子在路径上出现了(深度-1)次,即我们可以把路径上其中一个a[i]变为0,剩下的a[]值都含有上述因子,那么最大美丽度一定不小于这个因子。按这个方法跑一遍dfs就行了。
AC代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<map>
using namespace std;
const int MAXN=2e5+;
int num[MAXN],res[MAXN],mp[MAXN],g[MAXN];
vector<int> edge[MAXN];
bool vis[MAXN];
int gcd(int a, int b){
return (b==)?a:gcd(b, a%b);
}
void dfs(int fa, int depth){
int l=edge[fa].size();
int u,k;
for(int i=;i<l;i++)
{
u=edge[fa][i];
k=num[u];
if(!vis[u]){
vis[u]=;
g[u]=gcd(k, g[fa]);
res[u]=g[fa];
for(int j=;j*j<=k;j++){
if(k%j==){
mp[j]++;
if(mp[j]>=depth-) res[u]=max(res[u], j); if(j*j!=k){
int t=k/j;
mp[t]++;
if(mp[t]>=depth-) res[u]=max(res[u], t);
}
}
} dfs(u, depth+); for(int j=;j*j<=k;j++){
if(k%j==){
mp[j]--;
if(j*j!=k) mp[k/j]--;
}
}
}
}
return;
}
int main()
{
int n; memset(vis, , sizeof(vis));
scanf("%d", &n);
for(int i=;i<=n;i++) scanf("%d", &num[i]);
int a,b;
for(int i=;i<n-;i++){
scanf("%d %d", &a, &b);
edge[a].push_back(b);
edge[b].push_back(a);
}
vis[]=;
res[]=num[];
g[]=num[];
memset(mp, , sizeof(mp));
for(int j=;j*j<=num[];j++){
if(num[]%j==){
mp[j]++;
if(j*j!=num[])
mp[num[]/j]++;
}
}
dfs(, );
printf("%d", res[]);
for(int i=;i<=n;i++)
printf(" %d", res[i]);
printf("\n");
}
这个题目有毒,dfs(u, depth+1)后面如果记录了因子再去进行减的操作会wa,重新枚举因子就过了。是不是我姿势不对?
Codeforces 842C--Ilya And The Tree(dfs+树)的更多相关文章
- codeforces 842C Ilya And The Tree (01背包+dfs)
(点击此处查看原题) 题目分析 题意:在一个树中,有n个结点,记为 1~n ,其中根结点编号为1,每个结点都有一个值val[i],问从根结点到各个结点的路径中所有结点的值的gcd(最大公约数)最大是多 ...
- 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 ...
- Codeforces 842C Ilya And The Tree 树上gcd
题目链接 题意 给定一棵根为\(1\)的树.定义每个点的美丽值为根节点到它的路径上所有点的\(gcd\)值.但是对于每个点,在计算它的美丽值时,可以将这条路径上某个点的值变为\(0\)来最大化它的美丽 ...
- XJOI3363 树3/Codeforces 682C Alyona and the Tree(dfs)
Alyona decided to go on a diet and went to the forest to get some apples. There she unexpectedly fou ...
- CodeForces 682C Alyona and the Tree (树+dfs)
Alyona and the Tree 题目链接: http://acm.hust.edu.cn/vjudge/contest/121333#problem/C Description Alyona ...
- Codeforces 1076E Vasya and a Tree(树状数组)或dfs
题意:给你一颗以1为根节点的树,初始所有节点的权值为0,然后有m个操作,每个操作将点x的所有距离不超过d的节点权值+1,问经过m次操作后每个节点权值是多少? 思路:如果是一个序列,就可以直接用树状数组 ...
- codeforces 29D Ant on the Tree (dfs,tree,最近公共祖先)
D. Ant on the Tree time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- CF Edu54 E. Vasya and a Tree DFS+树状数组
Vasya and a Tree 题意: 给定一棵树,对树有3e5的操作,每次操作为,把树上某个节点的不超过d的子节点都加上值x; 思路: 多开一个vector记录每个点上的操作.dfs这颗树,同时以 ...
- POJ 3321 Apple Tree (DFS + 树状数组)
题意: 一棵苹果树有N个分叉,编号1---N(根的编号为1),每个分叉只能有一颗苹果或者没有苹果. 现在有两种操作: 1.某个分叉上的苹果从有变无或者从无边有. 2.需要统计以某个分叉为根节点时,它的 ...
随机推荐
- kafka 知识点整理
一个partition只能被同一个消费组内一个消费者消费,所以在同一时间点上,订阅到同一个partition的consumer必然属于不同的Consumer Group. 因此,如果设置的partit ...
- leetcode 235. 二叉搜索树的最近公共祖先(c++)
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x ...
- 007-TreeMap、Map和Bean互转、BeanUtils.copyProperties(A,B)拷贝、URL编码解码、字符串补齐,随机字母数字串
一.转换 1.1.TreeMap 有序Map 无序有序转换 使用默认构造方法: public TreeMap(Map<? extends K, ? extends V> m) 1.2.Ma ...
- 修改linux文件的mtime
一. Linux 文件个时间信息 所有Unix 文件系统中的文件或文件夹有三个时间戳,分别为atime.ctime和mtime. atime 表示最后一次访问(仅仅访问,没有改动)文件的时间: mt ...
- 安卓中如何调用jni
##指针和数组之间的关系 * 数组名就是数组元素的首地址 * 数组是一块连续的内存空间,每个元素之间的距离跟数据的类型有关 * 数组名字取地址,得到的还是数组的首地址 * arr[i] == *( ...
- Bootstrap 学习笔记5 进度条媒体对象和well组件
代码: <ul class="media-list"> <li class="media"> <div class="m ...
- 学习:多项式算法----FWT
FWT也称快速沃尔什变换,是用来求多项式之间位运算的系数的.FWT的思想与FFT有异曲同工之妙,但较FFT来说,FWT比较简单. 前言 之前学习FFT(快速傅里叶变换)的时候,我们知道FFT是用来快速 ...
- 学习:多项式算法----FFT
FFT,即快速傅里叶变换,是离散傅里叶变换的快速方法,可以在很低复杂度内解决多项式乘积的问题(两个序列的卷积) 卷积 卷积通俗来说就一个公式(本人觉得卷积不重要) $$C_k=\sum_{i+j=k} ...
- jQuery基础--基本概念
为什么要学习jQuery? [01-让div显示与设置内容.html] 使用javascript开发过程中,有许多的缺点: 1. 查找元素的方法太少,麻烦. 2. 遍历伪数组很麻烦,通常要嵌套一大堆的 ...
- shell编程:awk基础
语法格式: 一 awk 'BEGIN{}pattern{commands}END{}' file_name 二 standard output | awk 'BEGIN{}pattern{comman ...