codeforces1101D GCD Counting 【树形DP】】的更多相关文章

CF EDU 1101D GCD Counting 题意 有一颗树,每个节点有一个值,问树上最长链的长度,要求链上的每个节点的GCD值大于1. 思路 由于每个数的质因子很少,题目的数据200000<2*3*5*7*11*13*17=510510.所以每个节点的质因子个数不多.那么树形DP的时候直接枚举每种因子即可. //#pragma GCC optimize(3) //#pragma comment(linker, "/STACK:102400000,102400000") /…
题目分析: 蛮简单的一道题,对于每个数拆质因子,对于每个质因子找出最长链,在每个地方枚举一下拼接 代码: #include<bits/stdc++.h> using namespace std; ; int n,a[maxn],prime[maxn],flag[maxn],minn[maxn],num,ans; vector <int> g[maxn]; vector <pair<int,int> > mp[maxn]; vector<int>…
树形dp用一下就好了 /* dp[i]表示不删节点的gcd值 每个结点开个vector用来存储删一个点之后的最大值 然后排序 去重 */ #include<bits/stdc++.h> #include<vector> using namespace std; #define maxn 200005 ]; int n,a[maxn],head[maxn],tot,dp[maxn]; vector<int>vec[maxn]; void init(){ memset(he…
GCD Counting 思路: 预处理  每个权值的素因子.问题转化为  以同一个素数作为因子 最长的链, 树形DP求解,ans 由 此点的 最长子链 + 次长子链 相加得到, 然后再更新最长子链 #include<bits/stdc++.h> using namespace std; #define maxn 234567 int pri[maxn+10],n,a[maxn+10]; int x,y,dp[maxn+10][30],id,ans; int head[maxn+10],cnt…
题目地址:CF1101D GCD Counting zz的我比赛时以为是树剖或者点分治然后果断放弃了 这道题不能顺着做,而应该从答案入手反着想 由于一个数的质因子实在太少了,因此首先找到每个点的点权的所有质因子 进行一次树形dp,每次更新暴力枚举所有质因子即可 代码: #include <bits/stdc++.h> using namespace std; const int N = 200006; int n, ans = 1; vector<int> p[N], c[N],…
一.树形 DP 基础 又是一篇鸽了好久的文章--以下面这道题为例,介绍一下树形 DP 的一般过程. POJ 2342 Anniversary party 题目大意:有一家公司要举行一个聚会,一共有 \(n\) 个员工,其中上下级的关系通过树形给出.每个人都不想与自己的直接上级同时参加聚会.每个员工都有一个欢乐度,举办聚会的你需要确定邀请的员工集合,使得它们的欢乐度之和最大,并且没有一个受邀的员工需要与他的直接上级共同参加聚会.\(n\leq 6000\). Solution: 考虑一个子树往上转…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4661 题意:有n个人呈树状结构,每个人知道一个独特的消息.每次可以让一个人将他所知的所有消息告诉和他相邻的人.求所有人都知道所有消息花时花的步数最少的所有方案数. 首先需要满足的是最小的步数,所以我们一定是先把所有消息先传到一个人手中才是最优的,然后再从这个人传回去,也就是每条边走两次.我们只需要考虑单向传到某个人的方案数cnt,因为再传回去也是cnt.那么我们可以枚举每个点为收集点,把所有的和加起…
题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26482 题意:给一颗树,根节点为送电站,可以无穷送电,其它节点为house,电量达到pi时可以点亮,边为电线,传输有容量上限,求最多点亮多少个house.. 简单树形DP,f[i][j]表示第 i 个节点电量为 j 时最多点亮的house个数.那么f[u][j]=Max{ f[u][j], f[u][j-k]+f[v][k] | v为u的儿子节点 }.. //STATUS:C++_AC_…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4679 题意:给一颗树,每个边有一个权值,要你去掉一条边权值w剩下的两颗子树中分别的最长链a,b,使得w*Min(a,b)最小.. 说白了就是要枚举每条边,然后在O(1)的时间内求出两颗子树的最长链.因此我们可以考虑用树形DP,首先一遍DFS,对于每个节点维护两个信息,hign[u]:u为根节点的子树的深度,f[u]:u为根节点的子树的最长链.然后还要维护一个hige[i][0]和hige[i][1]…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4616 比较典型的树形DP题目,f[u][j][k]表示以点u为子树,经过 j 个陷阱的最大值,其中k=0表示从u点出发,k=1表示终点为点u.则转移方程为:f[u][j+is_rtap][k]=Max{ f[v][j][k] | v为u的儿子节点,0<=j<=m }.要分别对每颗子树求出最大值,枚举其中的两颗子树,一颗出,一颗进,更新最大值.要注意在更新k=0时的最大值是,j要从1开始遍历,因为如…