树形DP
包括换根,和一些树上操作的DP
为什么他们cf写的这么快
这个作者很懒,什么都没留下…
展开
-
Codeforces Round #513 by Barcelona Bootcamp (rated, Div. 1 + Div. 2) E. Sergey and Subway(树形DP)
题目链接题意:说实话我感觉这是一道阅读理解题。。。总的意思就是给定一棵树,对于原树中(注意是原树)长度为3的两点连一条边,注意只能是长度为3的,别的都不行,求连边后新的图的两两节点的路径之和。思路:考虑每条边的贡献,原来的话ans=∑∑dis(i,j),建边后ans=【∑∑dis(i,j)+(dis(i,j)%2)】/2;为什么会这样呢?因为建边后,原来长度为偶数的两点他们的长度会变为原来的...原创 2020-03-13 22:28:37 · 115 阅读 · 0 评论 -
Codeforces Round #526 (Div. 1) A. The Fair Nut and the Best Path(树形DP)
题目链接题意:给定n个点的树,树上每个点都有点权,每条边有边权,要求找出树上的两个点,两点间点权之和减去边权之和最大。思路:第一遍dfs先求u的子树到u的最大值,第二遍dfs看看除了子树以外的边能否更新最大值,这里要注意一下子树中两点的和,其实我这个做法有点多余了,好像只要记录u的子树的最大值和次大值就可以了。。。#include<bits/stdc++.h>using n...原创 2020-04-11 20:45:57 · 97 阅读 · 0 评论 -
Manthan, Codefest 17 C. Helga Hufflepuff's Cup(树形计数DP)(*)
题目链接题意:给你一棵树,可以染 m 种颜色,现定义一种特殊的颜色 K ,一棵树上最多能有 X 个特殊颜色。如果一个节点为特殊颜色 K ,那么他相邻的节点的值只能选比 K 小的颜色,问一共有多少种染色方案。思路:dp[i][j][k] 代表以 i 为根的子树中共选择了 j 个特殊颜色,且当前节点 i 的状态为 k 的染色方案数。#include <bits/stdc++.h>...原创 2020-04-11 20:41:22 · 117 阅读 · 0 评论 -
Codeforces Round #551 (Div. 2) D. Serval and Rooted Tree(树形DP)(好题*)
题目链接题意:n个节点的树,叶子可以任意分别给1~k(k为叶子个数)的值,每个节点有操作min,max分别取其子树的最小和最大的值;问根节点1最大多少;思路:这个题不看题解根本不会往这方面想,这个思路很清奇,dp【u】代表u这个节点在它的叶子节点中排第几大,我们先来一种最简单的情况,dp【2】=3,dp【3】=4,总数是10,2和3的父亲是1,假如1取min的话,dp【1】=dp【2】+...原创 2020-04-11 20:11:05 · 85 阅读 · 0 评论 -
Codeforces Round #527 (Div. 3) F. Tree with Maximum Cost(树形换根DP)
题目链接#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=2e5+5;vector<int>g[maxn];ll cnt=0,a[maxn],dp[maxn],sum[maxn];void dfs(int x,int fa,int deep){ ...原创 2020-04-11 20:03:18 · 98 阅读 · 0 评论 -
Codeforces Round #135 (Div. 2) D. Choosing Capital for Treeland(树形换根DP)
题目链接题意:给一个n节点的有向无环图,要找一个这样的点:该点到其它n-1要逆转的道路最少,(边<u,v>,如果v要到u去,则要逆转该边方向)如果有多个这样的点,则升序输出所有。思路:将正边设为0,反边设为1,于是题目就变成了一个无向图,找到到其他各个点的路径最短,第一遍dfs时dp【i】代表i和它的子树的路径和,第二遍dfs时dp【i】代表以i为根时i到其他所有点的距离。最后取...原创 2020-04-03 19:42:30 · 101 阅读 · 0 评论 -
Codeforces Beta Round #57 (Div. 2) D. Eternal Victory(树形dp)
题目链接题意:给定一棵树,现在从1出发走遍树中所有点的路径和最小。思路:dp【i】表示i的子树中最长的一条路径,答案就是边的总和*2-dp【1】。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=1e5+1;vector<pair<int,ll>...原创 2020-03-18 21:53:09 · 111 阅读 · 0 评论 -
Codeforces Round #627 (Div. 3) F. Maximum White Subtree(树形换根dp)
题目链接思路:我们把黑色结点设为-1,这样就有点和求最大子段和的做法有点类似,首先进行第一遍dfs,求出包含i点的它的子树的最大值,对于u->v来说,只要子树v的dp【v】大于0,那么它一定能对u产生贡献,然后我们进行第二遍dfs,当遍历到v,他的最大值其实就是要加上它父亲的最大值dp【u】(前提他要大于0)。#include<bits/stdc++.h>using n...原创 2020-03-13 10:52:36 · 136 阅读 · 0 评论 -
Codeforces Round #384 (Div. 2) D. Chloe and pleasant prizes(树形DP)
题目链接思路:有点和求树上的最大子段和差不多,但略有不同,因为cut了一条边以后它的所有子树和都要算进去,我们设dp【i】为i的子树中子树的sum和最大的,之后遍历i的子节点,每次选最大的两个来cut,记录答案取max。#include<bits/stdc++.h>using namespace std;typedef long long ll;const int max...原创 2020-03-03 20:26:12 · 93 阅读 · 0 评论 -
Educational Codeforces Round 67 (Rated for Div. 2) E. Tree Painting(树形dp)
题目链接题意:要你求以每个点为根时,所有子树和的最大值。思路:可以先dfs第一遍求出1为根时的答案,那么dp【v】=dp【u】+n-2*size【v】,(u是当前节点,v是u的儿子节点,size【v】是v的子树大小)#include<bits/stdc++.h>using namespace std;const int maxn=2e5+1;typedef long ...原创 2020-02-24 22:12:50 · 142 阅读 · 0 评论 -
2020 CCPC-Wannafly Winter Camp Day3 G 火山哥周游世界(树形dp)
题目链接参考了大佬的做法,学到了树的中心求法。大佬题解#include <bits/stdc++.h>using namespace std;const int maxn=5e5+1;typedef long long ll;struct node{ int y,len,next;}a[maxn<<1];int n,k,head[maxn<&...转载 2020-02-01 20:29:10 · 199 阅读 · 0 评论