树形DP
zxyoi_dreamer
退役了退役了爬了爬了,搞个锤子算法竞赛,不如好好享受大学生活。
展开
-
【THUPC2019】不用找的树 / tree(树分块)(树形DP)
传送门是我没见过的树分块姿势,出题人写的题解跟****一样,只有会这道题的人才看得懂,反正我没看懂,我看了std那8K难以形容的代码才知道题解真就NM乱写。严格来说,只有分块的具体方法那里是乱写,但是那里乱写直接导致了后续的无法理解。出题人:反正预计也不会有人想去写,题解乱写就行了。那乱写说是垃圾也就不为过了。所以这里来一个我的视角的题解。更离谱的是树上距离的定义居然是路径上点数而不...原创 2020-04-15 14:37:05 · 642 阅读 · 2 评论 -
【校内模拟】Fancy(Trie)(贪心)(树形DP)
简要题意:给三棵 trie 树,请你分别回答下列三个问题的最大最小值。第一棵树上点两两距离之和。在第一和第二棵树上连一条边之后,两棵树所有点两两距离之和。分别在第一棵和第二棵树,第二棵和第三棵树上连一条边,求三棵树所有点两两距离之和。题解:首先问题一是不存在多个答案的,考虑每条边被经过多少次可以得到,答案显然就是 ∑(n−sizu)sizu\sum(n-siz_u)siz_u∑...原创 2020-03-04 17:01:18 · 141 阅读 · 0 评论 -
【JSOI2019】神经网络(树上背包)(生成函数)(容斥原理)
传送门题解:由于树与树之间连成了完全图,我们实际上要考虑的每棵树上拿多少条链出来,这个可以直接树上背包求一下,注意这里的链要考虑方向。现在要把这些树链拿出来排成一个环,环可以旋转不能翻转。且相邻两个位置上放的树链不能来自同一棵树。设第iii棵树拿出jjj条链排成一个排列的方案数是fi,jf_{i,j}fi,j,对于“不能来自同一棵树”这个条件,我们考虑容斥,枚举有多少个断点合并。考虑...原创 2019-10-25 22:08:45 · 366 阅读 · 0 评论 -
【校内模拟】Polygon(结论)(树形DP)
简要题意:给你一个凸多边形,并且给你一个三角剖分,请你找一个以这个凸多边形顶点为顶点的三角形,使得在给出的三角剖分中,被你找的三角形覆盖的三角形尽可能多。题解:由于数据范围不大(出题人懒得写数据生成器造不了强的数据),考场上写的O(n2logn)O(n^2\log n)O(n2logn)的过了,但是这道题可以做到O(n)O(n)O(n)。将所有三角形建点,有公共边的三角形之间连边,显然是...原创 2019-10-24 16:18:53 · 222 阅读 · 0 评论 -
【SNOI2019】网络(我只会口胡不想实现)(长链剖分)(树形DP)
传送门口胡题解:我觉得来做这道题的同学有必要认识一下出题人lca,【十二省联考2019 希望】也是这位毒瘤神仙出的。。。那道题标程20K。。。首先注意到答案最后选择的是一个包含uuu且直径不超过ddd的极大连通块。注意到询问只有10个,而且没有修改,也就是说我们可以考虑处理出以每个点或每条边为连通块中心的答案,然后暴力枚举中心即可。那么考虑怎么快速处理出每个点为中心的答案。注意到这其...原创 2019-10-17 18:43:31 · 821 阅读 · 0 评论 -
【洛谷P5111】zhtobu3232的线段树(动态开点线段树)(树形DP)
传送门题解:动态开点构造线段树,记录每个点是否被ban,儿子区间中有多少能够表示出来,前缀有多少能够表示出来,后缀有多少能够表示出来。然后转移很简单,可以自己看代码。代码:#include<bits/stdc++.h>#define ll long long#define re register#define gc get_char#define cs const...原创 2019-07-29 16:16:27 · 195 阅读 · 0 评论 -
【CF809E】Surprise me!(莫比乌斯反演)(虚树)(树形DP)
传送门题解:前面那个关于nnn的式子丢掉不管。首先我们可以魔改树的标号使得我们需要求的式子变成下面这个:Ans=∑i=1n∑j=1nϕ(ij)dist(i,j)Ans=\sum_{i=1}^n\sum_{j=1}^n\phi(ij)dist(i,j)Ans=i=1∑nj=1∑nϕ(ij)dist(i,j)对于欧拉函数,有:ϕ(ij)=ϕ(i)ϕ(j)gcd(i,j)ϕ(gcd(i,...原创 2019-07-26 21:06:00 · 194 阅读 · 0 评论 -
【HDU5909】Tree Cutting(树形DP)(FWT)
传送门题解:首先我们发现树形背包的方程其实是很好列出来的。直接用FWT之后的数组做就行了。代码:#include<bits/stdc++.h>#define ll long long #define re register#define gc get_char#define cs constnamespace IO{ inline char get_char...原创 2019-08-06 21:35:56 · 146 阅读 · 0 评论 -
【集训队2011】【洛谷P4827】【HDU4625】Crash 的文明世界/JZPTREE(第二类斯特林数)(树形DP)
HDU传送门题解:求的东西形式非常简单:S(i)=∑j=1ndis(i,j)kS(i)=\sum_{j=1}^ndis(i,j)^kS(i)=j=1∑ndis(i,j)k首先这玩意可以非常简单地二项式展开,单次转移就被卡到O(k2)O(k^2)O(k2)了。考虑利用斯特林数将普通幂转到下降幂:xn=∑i=0nSn,ixi‾x^n=\sum_{i=0}^{n}S_{n,i}x^{\un...原创 2019-08-16 19:53:59 · 125 阅读 · 0 评论 -
【校内模拟】树(树哈希)(状压DP)
题解:和ZJOI2018线图里面的处理方式一样。找到重心,以重心为根。然后对于每一个子树哈希一下。接下来就很简单了,我们直接枚举A树里面的每一个点和B树的根匹配,然后状压DP算一下孩子的匹配方案数。复杂度有一个显然的上界是O(nm32m2)O(nm^32^{\frac{m}{2}})O(nm322m),但是里面有两个mmm和2m22^{\frac{m}{2}}22m是远远到不了的,目前...原创 2019-08-29 20:10:49 · 167 阅读 · 0 评论 -
【BZOJ3935】Rbtree(树形DP)
传送门题解:可以看出来是一个整数线性规划。然额,众所周知,整数线性规划是一个著名的NP Hard问题。我TM更是不清楚为什么这个线性规划的最优解一定是整数。然后就跑去写了树形DP。设f[u][k][v]f[u][k][v]f[u][k][v]表示离uuu最近的黑点为vvv,不要求vvv在uuu子树内部,uuu子树内部有kkk个黑点的最小代价。xjb讨论一下写个转移就行了。被单纯形...原创 2019-09-04 15:48:38 · 271 阅读 · 0 评论 -
【十二省联考2019】希望(长链剖分)(树形DP)(线性求逆元)(可回退化)
传送门近年来std最反人类的题。然而这是因为lca不知道在想什么专门写了个内存池管理加上大量注释和空行, std上900行也不是不能理解。选手命要没了然而如果真的要喷这道题的话...原创 2019-09-05 20:42:25 · 350 阅读 · 0 评论 -
【校内模拟】攻城略池(启发式合并)(树形DP)(二分答案)
题解:发现实际上把每个儿子第一次到达祖先的时间点拿出来排个序,祖先单位时间受到的伤害其实是个分段一次函数。总伤害就是求前缀和。需要维护排好序的儿子到祖先的时间,dsu on tree,每次计算的时候二分答案并check,没了。。。代码:#include<bits/stdc++.h>#define ll long long#define re register#defin...原创 2019-10-03 15:39:10 · 269 阅读 · 0 评论 -
【TC SRM 659】PublicTransitHard(线段树)(树形DP)
传送门题解:其实方案一共就只有 O(n2)O(n^2)O(n2) 那么多,考虑判断每个方案是否可行,现在的问题是如何降低check的时间复杂度。假设传送门已经确定下来了,那么哪些道路可能用到传送门。显然这些道路和传送门覆盖的路径至少有一条边相交。也就是说剩下的路径必须满足距离小于等于 XXX 。枚举传送门的一个端点,令它为根进行一次dfs,则传送门覆盖路径是某个点到根的路径。与传送门...原创 2019-10-08 09:32:53 · 163 阅读 · 0 评论 -
2019.04.03【校内模拟】战略游戏(game)(组合数学)(生成函数)(FFT)(树形DP)
传送门解析:在看完题目三个条件之后,我们得到需要做的事情就是,钦定两个点为特殊点,它们之间的路径为特殊路径,计算向外伸出小于等于kkk个互不相交的分叉的方案数。k=1k=1k=1的情况直接输出答案即可。现在我们不考虑编号大小,最后方案数/2/2/2即可。显然我们需要树形DP。设我们当前处理到uuu,c[i]c[i]c[i]表示以uuu为根的子树向子树内伸出iii个互不相交的分叉的方案...原创 2019-04-03 22:03:10 · 245 阅读 · 0 评论 -
2019.03.09【BZOJ4316】小C的独立集(仙人掌)(树形DP)
传送门解析:仙人掌DP水题。。。考虑一般的树是怎么做的DP。f[u][1/0]f[u][1/0]f[u][1/0]表示选或不选uuu的时候,uuu的子树中的最大独立集。对于仙人掌来说,我们不能这样做了,因为非树边会导致我们不知道环顶和环底的限制之间会不会产生矛盾。但是我们发现各个环是相对独立的。所以我们可以对于每个环,先处理出除环顶外的每个点的外向子图中的最大独立集大小。将环拿出...原创 2019-03-09 14:32:02 · 155 阅读 · 0 评论 -
2018.10.04【CodeForces1060】E. Sergey and Subway(树形DP)
传送门解析:首先我们把树按照黑白交错染色,显然黑点的新边只会连在黑点上,白点同理。然后我们考虑统计每条边的贡献。是的,我们不分点统计贡献,而是分边统计贡献。考虑有几个点对会经过这条边就行了,反正每条边的边权是1。最后还要统计一下黑白点的贡献。显然贡献的统计被重复了两次,最后输出答案的时候要除2。代码:#include&lt;bits/stdc++.h&gt;using na...原创 2018-10-04 22:59:01 · 212 阅读 · 0 评论 -
2018.10.17【校内模拟】发电机(树形DP)(期望)
传送门解析:很显然的O(n)O(n)O(n)DP,显然在这个节点子树以外的位置安装发电机对这棵子树是没有任何影响的,而子树中任何一个节点安装发电机都会使这棵子树的根节点通电。所以,在等概率选择的情况下,单独考虑某个节点,要使它通电,必须在子树中选择一个节点,而刚好选到它的概率就是子树大小分之一。然后这道题就做完了?你卡空间了吗?你写的是DFSDFSDFS吗?爆栈了吗?你卡常了吗?(...原创 2018-10-17 23:32:12 · 152 阅读 · 0 评论 -
2018.09.28【BZOJ3566】【洛谷P4284】【SHOI2014】概率充电器(树形DP)(概率DP)(容斥原理)
BZOJ传送门洛谷传送门解析:感觉挺新奇的DPDPDP题。思路:首先看题目,这是一棵树。再看,要求期望数。而这严格来说是求的概率,因为这道题期望就是各个点被充电的概率算术和。而我接下来要介绍一下两种概率的计算。对于互相独立的事件A,BA,BA,B,其中发生任意一件的概率为P(A∣B)=P(A)+P(B)−P(A)∗P(B)P(A|B)=P(A)+P(B)-P(A)*P(B)P(A...原创 2018-09-28 14:32:06 · 190 阅读 · 0 评论 -
2018.10.25【NOIP练习】最大疯子树(树形DP)
传送门解析:其实简单推一下我们发现一个疯子树内部任何一条路径上点权都是单峰下凸的。证明也很简单,不过请记住一点,考场上没有必要去想证明,除非你时间真的很充裕。必要性:如果不是单峰下凸,则不是疯子树。考察如果寻在一条不是单峰下凸的路径,那么这个路径的某一个端点与其±1\pm 1±1的端点的路径必然会有一条经过这条路径上的峰值的位置,显然就不满足疯子树的性质。充分性:如果所有路径都是单峰...原创 2018-10-25 08:37:41 · 359 阅读 · 0 评论 -
2018.11.08【CodeForces990】F. Flow Control(树形DP)
传送门解析:首先无解的情况当且仅当权值和不为0。不然由于图是联通的,一定存在解,而实际上我们并不需要图的性质,我们只需要树的性质就可以做树形DP了。我们直接计算它子树内部会有多少权值需要转移,然后沿这条边转移就行了。代码:#include&lt;bits/stdc++.h&gt;using namespace std;#define ll long long#define r...原创 2018-11-08 18:31:05 · 121 阅读 · 0 评论 -
2018.12.08【BZOJ2152】聪聪可可(树形DP)
传送门解析:维护从子树内到该节点上有多少条路径模3余0,1,2就行了。统计考虑以每个点为lcalcalca的路径有多少条满足条件。(其实这道题可以点分治)代码:#include<bits/stdc++.h>using namespace std;#define ll long long#define re register#define gc getchar#...原创 2018-12-08 14:32:43 · 176 阅读 · 0 评论 -
2019.03.01【HNOI2018/AHOI2018】【BZOJ5290】【洛谷P4438】道路(树形DP)
BZOJ传送门洛谷传送门解析:出这种无聊的空间优化题。。。出题人也真的是够了。题意简述一下就是,一颗二叉树,对于每个叶子节点,设它到根的路径上需要经过的未被指定的左右向边数量分别为L,RL,RL,R,则计算它的贡献为c(a+L)(b+R)c(a+L)(b+R)c(a+L)(b+R)。乍一看只能网络流,先%DZYO队爷,给出了这道题的网络流解法。但是由于深度最多只有404040,所以O...原创 2019-03-01 18:39:36 · 280 阅读 · 3 评论 -
2019.03.01【HNOI2018/AHOI2018】【BZOJ5287】【洛谷P4426】毒瘤(容斥原理)(虚树)(树形DP)
BZOJ传送门洛谷传送门解析:这道题题意很清楚,就是求一个稀疏图的独立集数量(稀疏到极点的那种)。暴力做法也很显然,树的情况直接上树形DPDPDP,有非树边的情况直接枚举非树边两侧端点或特殊点的情况跑树形DP。然后加上容斥原理优化就有75pts75pts75pts了。对于其他题解,我只想说:你们都知道暴力有容斥做法了为什么建完虚树用了个那么诡异的方法?建完虚树继续容斥啊。发现转移其...原创 2019-03-01 20:00:05 · 193 阅读 · 0 评论 -
2019.02.26【九省联考2018】【BZOJ5250】【洛谷P4365】秘密袭击(树形DP)(线段树合并)(生成函数)(拉格朗日插值)(暴力碾标算)
BZOJ传送门洛谷传送门解析:首先这道题O(nk(n−k))O(nk(n-k))O(nk(n−k))的暴力就已经可以过了(而且不用开O2)。(据说这个上界不容易被卡满)而标算不开O2O2O2过不去,开了还是跑不过暴力。。。先来说说暴力:直接考虑DP出每个点作为第kkk大的方案数有多少,然后算就行了。由于我们只需要考虑第kkk大,这里可以剪一剪枝,最多只需要跑O(n−k)O(n-k)...原创 2019-02-26 18:43:50 · 555 阅读 · 0 评论 -
2019.03.07【SDOI2018】【洛谷P4620】【BZOJ5333】荣誉称号(DP)
洛谷传送门BZOJ传送门解析:我TM也不知道这道题的随机有什么性质可以利用,反正我没看出来。但是有一点是可以确定的,那么小的k,mk,mk,m和那么大的nnn以及完全二叉树的形态不是摆设。显然一个点最终的权值必须和他的K+1K+1K+1级祖先相同。所以我们只需要在前KKK层维护,将下面的所有点的信息合并上来就行了。剩下的随便转移出每个点及其子树内部决策完后当前链权值和%M\%M%M...原创 2019-03-08 21:45:39 · 145 阅读 · 0 评论 -
2019.03.07【APIO2018】【洛谷P4630】【BZOJ5463】铁人两项(圆方树)(树形DP)
洛谷传送门BZOJ传送门解析:对所有点双建立圆方树,设圆点权值为−1-1−1,方点权值为点双大小。那么原题转化为求树上所有圆点两两路径的权值和,直接上树形DP。代码:#include<bits/stdc++.h>using namespace std;#define ll long long#define re register#define gc get_cha...原创 2019-03-08 21:53:16 · 163 阅读 · 0 评论 -
2019.03.08【JSOI2018】【洛谷P4516】【BZOJ5314】潜入行动(树形DP)
洛谷传送门BZOJ传送门解析:挺简单的一道树形DP,应该是出题人不想让输出0的拿太多分所以深度设置较小,其实应该先求一遍直径来判断是否有解再进行DP,懒得写了 ,这样才能保证复杂度。设f[u][i][0/1][0/1]f[u][i][0/1][0/1]f[u][i][0/1][0/1],表示uuu的子树中(包括uuu)放置了总共iii个监听器,uuu没放/放了,没被监听/被监听的方案数。...原创 2019-03-09 10:16:21 · 126 阅读 · 0 评论 -
2018.09.02【清华集训】榕树之心 (树形DP)
传送门解析:读完题应该都猜得到是树形DPDPDP。。。那么怎么DP?考虑每一个子树,显然我们应该尽量少把榕树的心往子树拉,所以当心在子树中时,我们可以通过子树叶子的生长来相互抵消,也就是说,要记录每个子树的sizsizsiz。令w[i]w[i]w[i]表示以iii为根节点的子树最少把心往该子树拉的距离。令iii最大子树为maxn[i]maxn[i]maxn[i],次大子...原创 2018-09-02 15:31:05 · 247 阅读 · 0 评论