
树形dp
Mys_C_K
人生有许多道:曾经踏足的是道,即将踏往的也是道,那什么才是道呢?唯有脚下走的才是道。一切精神或者物质都归于虚无,然后从混沌中衍生出三万道。在悲喜间涉足一条无数前人经历过,且将有无数后人奔赴的道,无论是否已经或者将要到达彼岸,然后便不再回头或是左顾右盼,即使有些道繁盛至极,夜灯如昼,无数人一浪又一浪的涌去,造就了世人皆知的辉煌;即使有些道草木凋敝,荒草丛生,只等勇敢的开拓者斩开荆棘,创造一片天地;这些都无所关,无所在意,彼岸何如、来日何方甚至过往旧事都化作一缕云烟,飘渺碧霄,我自撷高山之月色,独随足落处往行。
展开
-
vijos1476 旅游规划-动态规划
传送门 题解: 我是这么做的,首先第一遍求出每个点向下的不相交的最长链和次长链, 这样两条链拼起来就是就是过这个点(不包含他的父亲的情况下)的最长链。 在这些最长链中取max就可以得到直径。 然后一个点在直径上,要么他本身就在已经求出的最长链上(就是从这个点出发的最长+次长链=直径长度), 要么如果这个点在某一条直径的某条链上(即这个点向父亲方向延伸的最长+这个点向下的最长=直径长度)原创 2017-05-26 21:56:40 · 687 阅读 · 0 评论 -
NOIP2018 Day2 T3 保卫王国 - 动态dp - 树剖 - 线段树
直接裸上动态dp即可,因为某些不知道的原因NOIP能过,别的地方不开O2都过不了。upd:2018/11/27:现在luogu上不开O2也能过了,只要为每条重链单独开线段树就可以了(代码附后)。原创 2018-11-20 18:23:48 · 628 阅读 · 0 评论 -
NOIP2018 Day1 T3 赛道修建 - 二分套二分 - dp - 贪心
场上心路历程: 首先这显然好像是个dp。卧槽这个题能多项式? 考虑了一会列了个部分分表,发现我会做m=1求直径,会做链,还以为会做星星。 嗯确定了一定是dp,一定要二分答案。 然后写完暴力开始写链的时候突然想,诶星星怎么做来着??? 仔细冷静了一下发现星星想得有问题。 开始慌,写了一半的链弃。 冷静了一下想起了以前cf做的一个题,当时读错题了,在读错题的基础上有人跟我说了个错误做法,当时大意是dp...原创 2018-11-20 17:32:50 · 459 阅读 · 0 评论 -
bzoj 4182 shopping - 树dp - 点分治
考虑一个O(n2m)O(n^2m)O(n2m)的暴力,枚举一个点当根,然后按照dfs序的最后一次访问为阶段做dp,那么每个点要么其子树完全不选(等价于之考虑了Lvis[x]-1),要么就直接在Rvis[x]-1上选x(把x得子树合并起来)。用点分治优化上述过程即可。实际上也可以用dsu on tree做,常数更小。 点分治: #include<iostream> #include&lt...原创 2018-09-20 16:59:28 · 280 阅读 · 0 评论 -
直径 - 树dp
题目大意:给你一颗树T,1为根。 新建m颗树为森林,每颗树都是T的一个子树。 将这个森林连接起来,每次形如把第a颗树中的b点和第c颗树中的d点连起来。 最后求这玩意的直径。 题解: 显然可以虚树dp,没写。 考虑首先对T的每个点求其子树直径。 有个结论是这样的,两个树连一条边形成一颗新的树,新的树的直径的端点是原两颗树的直径的四个端点中选择某两个。 然后dfs那个询问树,像朴素dp...原创 2018-09-09 19:20:11 · 213 阅读 · 0 评论 -
AGC 014 D Black and White Tree - 树dp
结论是后手必胜当且进当存在完美匹配。 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<vector> #define gc getchar() #define N 100010 #define pb push_back ...原创 2018-08-16 15:45:22 · 195 阅读 · 0 评论 -
AGC 008 F Black Radius - 树dp
全机房的人讨论了很长时间最后感谢STL直接看了日文题解翻译了过来。 做法是这样的:一开始都以为是什么枚举x然后枚举d,光荣gg。 因此我们考虑枚举你染黑的连通块的中心(也就是所有直径的中点)。 有两种情况: 1)中心是一个点; 2)中心是一条边的中点; 对于1),考虑将其置为根rt,则连通块的“半径”是一个区间(半径就是说这个联通块的直径的一半)。 首先考虑其上界R:答案就是来自不同...原创 2018-08-15 17:13:09 · 296 阅读 · 0 评论 -
bzoj 4987 Tree - dp
傻逼dp题。 #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #include<climits> #define gc getchar() #define debug(x) cerr<<#x<<"=&原创 2018-08-06 12:30:44 · 230 阅读 · 0 评论 -
ARC 083 E Bichrome Tree - dp
考虑一个朴素dp,设dp[x][i][j][k]表示考虑x这个节点的前i个儿子和x同色的权和是j另一种权和是k是否可行,转移显然,最后只要j<=Xx即可。显然j固定的时候k越小越好,因此对k做背包即可。 #include<iostream> #include<cstring> #include<cstdio> #include<algorith...原创 2018-08-09 15:53:22 · 209 阅读 · 0 评论 -
codeforces 804 D. Expected diameter of a tree - 分块(并不显式分块) - dp
题目大意:给你一张森林,每次询问两颗树TA,TB(A≠B)TA,TB(A≠B)T_A,T_B(A\neq B),求: ∑x∈TA∑y∈TBD(T=(V(TA)⋃V(TB),E(TA)⋃E(TB)⋃{(x,y)}))∑x∈TA∑y∈TBD(T=(V(TA)⋃V(TB),E(TA)⋃E(TB)⋃{(x,y)}))\sum_{x\in T_A}\sum_{y\in T_B}D(T=(V(T_A)\bi...原创 2018-06-25 12:31:00 · 304 阅读 · 0 评论 -
bzoj 3162 独钓寒江雪 - 无标号树同构 - dp - 学习笔记
对于无标号树计数首先要找到其重心作根,如果有多个就再建一个点连着两个点;这样能够保证一个节点的某棵子树不会和整棵树减去当前这颗子树形成的树同构,这样就转化为有根树。哈希就随便哈希即可。这个题,如果一个节点有x颗同构的树并且每一颗子树都有y中方案,那么就相当于y个变量每个变量取值&gt;=0其和为x的方案数,组合数一波即可。 #include&lt;iostream&gt; #include&...原创 2018-05-01 12:33:35 · 247 阅读 · 0 评论 -
一道神奇的树形dp题
题目大意:给定n,m,对于1~n中的每一个k,求有k个叶子结点且满足以下性质的二叉树的个数: 1)一个点要么是叶子结点,要么有左右儿子。 2)从根出发的任意一条路径上,向左的边不超过m次。 对998244353取模。n,m<=5000。 题解如下: 首先容易想到dp[x][y]表示x个叶子最远向左走y次的方案数,然后转移枚举左边子树的叶子个数,用容斥剪掉重复计算部分。 发现这个转...原创 2017-09-26 07:28:30 · 485 阅读 · 0 评论 -
POJ 1849 Two - dp
传送门 题目大意:自行参考 题解: exm??? 如果必须回到根结点那么答案就是边权之和的两倍。 注意到两个人肯定是走到叶子结点,这样就少走了两人之间的链长的距离。 所以要最大化链长,所以就是求直径。 答案就是边权之和的两倍减去直径长度即可。 代码: #include #include #include #include #define MAXN 100010 using nam原创 2017-06-15 10:55:11 · 371 阅读 · 0 评论 -
BZOJ1827 奶牛大集会 - 树形dp
传送门 题解:分两遍dfs来做,首先求出f[x]表示以x为根且为重心,子树到其加权距离和。 转移即f[x]=\sigma {f[y]+sz[y]*dist(x,y)},其中y是x的子节点,sz为子树大小。 然后利用f数组计算答案,发现答案比f数组多了从父亲来的部分,用v表示 则v[x]=v[y]+(full_size-sz[x])*dist(x,y),其中y为x的父节点,full_size原创 2017-06-24 21:21:34 · 421 阅读 · 0 评论 -
POJ 3417 Network
传送门 题目大意:给定一棵树和若干条边,问删去树上的一条边和给定的边中的一条使得图不联通的方案数。 题解: 首先注意到,把树上的一条边断掉变成的两个联通块,如果这两个联通块之间恰好有1条给定的边那么方案数+1. 如果没有那么再任意删去一条即可,方案数+(给定的边数) 那么一个显然的做法就是枚举n-1条边然后再枚举m条边然后统计。复杂度O(nm*统计答案的复杂度)。 显然这个东西是可以转原创 2017-07-11 21:02:27 · 411 阅读 · 0 评论 -
codevs1378 选课-树形dp
传送门 题目大意:自行参考 题解:简直就是《金明的预算方案》的加强版QwQ 这个题神就神在,我们可以把一颗子树看作一个物品,只不过这个物品的体积和价值不固定。 由于这个题福利子树的体积=子树的大小。 所以可以认为子树的价值是一个关于子树大小的函数。 这样就强行把它想象成一个背包来做。 只不过不是处同意以上分配固定的体积,而是转移的时候还要枚举分配给第i颗子树多大的体积。 如果就这么原创 2017-05-26 22:06:51 · 470 阅读 · 0 评论 -
路径(path) - 随机 - 树dp
题目大意: 给一颗树,每个点有点权w。你可以选择一个不超过T的非负整数C,然后给所有点的点权+C,然后所有点的点权对P取模。 这之后你要选择若干点不相交的链,假设链上的点权和S,选了k条,那么收益是Sk+1\frac{S}{k+1}k+1S。求最大收益。n≤5000,P≤105n\le5000,P\le10^5n≤5000,P≤105 题解:考虑确定C之后可以二分然后dp。 发现有用的C是O(n...原创 2019-04-09 11:15:23 · 296 阅读 · 0 评论