![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树
DOFYPXY
这个作者很懒,什么都没留下…
展开
-
[雅礼4-7]T1 prufer序列&&dp
考场上神tm忘了可以乘逆元结果复杂度变成n^5,T了两个点。。。 说说我自己的做法吧,首先一棵树和它的prufer序列是一一对应的,而且一个度数为w的点在序列中出现了w-1次。于是我们针对prufer序列来设计状态。f[i,j,k]表示枚举到第i个点,选了其中j个点进序列,使用了k个序列空间,于是f[i, j, k]=f[i-1, j, k]+ sigma {f[i-1, j+1, k-t]* C原创 2017-04-17 21:50:25 · 426 阅读 · 0 评论 -
[ARC087]F - Squirrel Migration 树+容斥原理
题面 先考虑每条边(u,v)(u,v)的松鼠通过量,最大显然为2∗min(sizeu,sizev)2*min(size_u,size_v),这里的sizesize指去掉这条边后的两个子树大小。所以我们分两种情况。 有两个重心:答案显然为(n2)!2(\frac{n}{2})!^2 有一个重心:我们设去掉重心后的子树为T1,T2,...,TrT_1,T_2,...,T_r;TT为它们的并。 要原创 2017-12-26 07:26:20 · 501 阅读 · 0 评论 -
[BZOJ4182]Shopping 点分治+dfs序+多重背包单调队列
题目的限制就是买的点必须是一个联通块。 考虑先枚举一个点必选,那么就是一个有依赖的多重背包(就是选了子树根才能选子树中的点),用一下树型背包的套路:先搞出dfs序,设fi,jf_{i,j}表示考虑了dfs序后ii个点,花了jj的钱的答案,如果不选就跳过整棵子树的区间,如果选就从i+1i+1转移过来即可。 考虑把这个枚举变成点分治就可以了,复杂度O(mnlogn)O(mn\log n)。 代码原创 2018-01-04 22:05:32 · 814 阅读 · 2 评论 -
[BZOJ2159]Crash的文明世界 树型DP+第二类Striling数
听说形如xkx^k的都是Stirling数的套路?我怎么没听说过啊。。。 有个性质:xk=∑i=1kS(k,i)∗i!∗(xi)x^k=\sum_{i=1}^k S(k,i)*i!*{x\choose i} 考虑一个组合意义证明,就是给kk个格子染xx种色的方案数,等于先把这kk个格子分成若干集合,在选出相同个数的颜色,每个集合染同一种颜色的方案数。i!∗(xi)i!*{x\choose i}原创 2018-01-07 22:16:29 · 506 阅读 · 0 评论 -
[2018雅礼集训1-23]盛大的庆典 状压DP
题面 考虑把每一对点的路径放到其lca上考虑,为叙述方便,记sonx" role="presentation" style="position: relative;">sonxsonxson_x为当前点儿子中子树包含x" role="presentation" style="position: relative;">xxx的那一个。设fi,S" role="presentation" style原创 2018-01-24 20:51:55 · 394 阅读 · 0 评论 -
[BZOJ4455][ZJOI2016]小星星 容斥原理+树型DP
先考虑一个错误的DP,fi,jf_{i,j}表示子树ii中,ii映射到jj的方案数,这样可能一个点被重复映射。 我们考虑多一维状态fi,j,Sf_{i,j,S}表示映射点集至多为SS的方案,枚举SS来DP,用朴素的容斥原理来求出正确答案即可。 代码:#include#include#include#define ll long longusing namespace std;原创 2018-01-20 19:51:47 · 860 阅读 · 0 评论 -
[BZOJ2098]又是nand 树链剖分+位运算
观察nand这个运算,发现它有交换律但是没有结合律,所以就不要考虑各种差分或者分段计算合并的方法,而且得按顺序维护。 首先可以想到树链剖分,因为有顺序,所以线段树区间上要维护从lll到rrr的运算结果和从rrr到lll的运算结果,而且对于运算结果还与进来的初值有关,发现每一位是独立的,我们要对每一位维护初值是0/10/10/1,运算顺序是l→r/r→ll→r/r→ll\to r/r \to l的...原创 2018-04-22 22:13:42 · 622 阅读 · 0 评论 -
[BZOJ2001][HNOI2010]城市建设 分治最小生成树
有一个引理,就是做最小生成树的时候,假设有mmm条边权值不确定,是可以把整个图简化到边数只有O(m)O(m)O(m)级别的。 也就是说假如考虑分治,把修改的那些边看成不确定边,然后简化一下图,分治下一层的时候就大概只需要做边数只有分治区间大小级别的最小生成树,复杂度就能降到O(mlog2m)O(mlog2m)O(m\log ^2m)。 具体简化图的方法如下: 1. 先强制合并所有不确定边(...原创 2018-05-20 19:44:08 · 541 阅读 · 0 评论 -
[AGC024] E - Sequence Growing Hard 树型DP
把问题看成每次向序列中添加一个[1,K][1,K][1,K]的数,假设我们要填的数是xxx,因为要保证字典序变大,那么所填的位置往后的第一个非xxx数必须<x<xxxx中的任意位置再填一个xxx都是等价的,所以等同于只能在一个<x<xxxx。 那我们把填一个数看成一个二元组(t,w)(t,w)(t,w),表示在第ttt次填了数www,假设把这个www填的位置后面的那个&l...原创 2018-05-21 09:16:16 · 744 阅读 · 0 评论 -
[SPOJ] COT2 树上莫队
树上莫队原创 2018-05-28 11:43:22 · 396 阅读 · 0 评论 -
[JZOJ5739]毒奶 子集DP
这里讲的是O(3n⋅n)O(3n⋅n)O(3^n\cdot n)的可以过的暴力,正解不会。。。 把问题转化成给了nnn个白点,nnn个黑点,给定了n−1n−1n-1条白白边和黑黑边,求再填nnn条黑白边使之联通的方案数。 先用给定的边缩点,记下缩点后每个大点的sizesizesize,然后随意钦定一个白点当根,剩下就是要求一层黑一层白的填,直接子集DP即可。 具体地,设FS,c,iFS,c,...原创 2018-05-24 09:44:45 · 480 阅读 · 0 评论 -
[BZOJ5333][SDOI2018]荣誉称号 树型DP
首先发现最终的aiaia_i一定和a⌊i2k+1⌋a⌊i2k+1⌋a_{\lfloor\frac{i}{2^{k+1}}\rfloor}同余。 那么只要把第k+1k+1k+1层及其之后的代价统计进前kkk层即可,也就是预处理出vi,jvi,jv_{i,j}表示前kkk层中的aiaia_i在模mmm调整至jjj的代价。 然后只要设fi,jfi,jf_{i,j}表示点iii到第kkk层的路径上aa...原创 2018-05-24 10:37:00 · 406 阅读 · 0 评论 -
[ARC086]E - Smuggling Marbles 树型DP
题面 首先可以发现以0为根时,层与层之间时独立的,于是就有了一种O(n^2)的做法:对每一层DP一次,设f[d][i][0/1]表示当前考虑第d层的贡献,i的子树中贡献0/1的方案数。那么最后我们得到很多f[][0][0/1],然后问题就变成从每个f[d][0][0/1]只能选其一,选中的数相乘并乘上选的f[][0][1]的个数再求总和,随便计数一下就好。 接着我们考虑怎么把这么所有层放在一起D原创 2017-12-14 11:37:26 · 578 阅读 · 0 评论 -
[2017纪中11-5]仔细的检查 树hash
题面 树hash裸题。 正确姿势貌似是找重心,然后每次计算x点的hash值要把其子树的hash值排序之后再像字符串那样hash,最后融进自己的一些信息去。 我则是乱搞,每个点的hash值是其儿子的hash值的和+R(size[x],num[x])(关于其子树大小和儿子个数的一个函数,千万不要是一次的。。。)这样就可以O(1)换根啦。 找到一个相同的根,两个再一起跑一边DFS就可以啦。 代码原创 2017-11-05 21:38:01 · 270 阅读 · 0 评论 -
[BZOJ1791][IOI2008] Island 基环外向树+DP
题中说每个点连出一条边,所以图应该是很多个基环+外向树。 对于每一个联通块,一条最长路径可能在某一棵子树中,也可能两棵子树各一部分加上中间一段环的路径。所以先找出它的环,对每棵树先进行树型DP,记到根最长距离为g[i]。然后把环展开(1-2-3的环展开成1-2-3-1-2),维护一个距离前缀和dis[i],这就是一个决策区间单调移动的DP了,方程为f[i]=max{g[j]-dis[j]}+dis原创 2017-04-27 08:04:21 · 787 阅读 · 0 评论 -
[2017雅礼集训6-28]T1 tree
dp[i][0]表示i不与i的子树中的白点相连的最小代价,dp[i][1]类似。 转移显然: dp[v][1]+=min(dp[son][1],dp[son][0]+cost); dp[v][0]+=min(dp[son][0],dp[son][1]+cost); 边界条件: 如果无颜色都为0,有颜色则对应的那个为inf。代码:#include<iostream>#include<cst原创 2017-06-30 21:30:56 · 455 阅读 · 0 评论 -
[BZOJ]3257树的难题 树型DP
dp[v][0/1][0/1/2]表示dp到v点,与v联通的一块没有黑点/有黑点,没有白点/有一个白点/有很多白点所需最小代价。考虑v与其儿子的边删还是不删转移就可以了。 这个好复杂,其实令dp[i][0/1/2]表示以i为根的子树中,满足题目要求且i所在的联通块是无黑色点/无白色点/有一个白色点的边权和最小值。 转移应当十分显然。 令u为i的其中一个儿子,len为连接u,i的边权+dp[u]原创 2017-10-17 18:26:39 · 458 阅读 · 0 评论 -
[2017纪中11-6]拆网线 树型DP/二分图匹配
题面 首先考虑到,把企鹅分成若干对,每一对的两只企鹅共用一条网线是最优的。变成一个树上的二分图匹配问题,每条边有2的贡献。 但并不一定每个企鹅都能被匹配,但因为是树是一个联通的二分图,未能匹配的点必定连着一个已经匹配的点,这样每条边只有1的贡献。 假如企鹅是奇数个,也必定要花1的代价把它连进去。 于是f[x][0/1]表示以x为根的子树中,x未被匹配/已被匹配的最大匹配数。树型DP即可。原创 2017-11-07 14:51:18 · 376 阅读 · 0 评论 -
[BZOJ2525][Poi2011]Dynamite 二分答案+贪心+树型DP
先二分一个最短时间t,判断是否在最多选D个的情况下满足。 每个点设一个权值w,w<0表示其子树中(最远的未能在t时间引燃的炸药的离它的距离+1),w>0表示其子树中(炸药全部能引燃,而且还可以向上传递剩余的时间+1),w=0表示子树全部引燃但已经没有向上剩余。 设mxt表示其儿子中w的最大值,mit表示最小值,f[i]表示当前情况下子树中最少需要的引燃点数,转移如下: if(mxt>=-m原创 2017-10-30 20:03:04 · 389 阅读 · 0 评论 -
[2017纪中10-31]Tree 构造
加入x的子树都已变白,x为黑的画,把x和x的所有儿子反色一下就好了。dfs一遍即可。 代码:#include<iostream>#include<cstdio>using namespace std;const int maxn=500010;int n;bool c[maxn],f[maxn];struct edge{ int t; edge *next;}*co原创 2017-10-31 15:33:18 · 292 阅读 · 0 评论 -
[2017纪中10-24]合影 树型DP+组合数学
题面 因为每个人只有一个要求,假如A要求在B左边,A就向B连一条边的话,就是一个带环树。 当然,有环直接无解。所以剩下的是森林。 我们把子树看成一个子问题,假如知道了子树内部的答案如何转移到父亲。设当前转移X,X的所有子树都应该安排在X左边,也就是首先有size[X]-1个空来安排,每安排一个子树剩下的空就减一些。安排第一个儿子C(size[X]-1,size[son1])* ans[son1原创 2017-10-24 16:28:53 · 434 阅读 · 0 评论 -
[2017纪中11-9]道路重建 点双连通分量+树的直径
题面 考虑缩点双连通分量,缩点之后成为一棵树,那么加一条边(x,y)可以使得原树上x到y的路径上的所有边变得不危险,于是跑个树直径即可。 代码:#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn=200010;int n,m,tim,top,nc,dfn[maxn],原创 2017-11-10 15:24:47 · 294 阅读 · 0 评论 -
[2017纪中11-2]救赎 dfs序+树状数组 / 递推
题面 考场O(nlogn)做法: 对于一棵有根树,考虑每个点和它的儿子们的那些边的期望,容易得出答案为: 假如建出来的树以1为根,计算出子树大小sz和儿子个数num,那么考虑一个点对不同点为根节点的答案的贡献: 1、根节点不在它的子树中,上式size=sz[x],|son|=num[x]。 2、根节点为它自己,上式size=n,|son|=num[x]+1。 3、根节点在它的某个儿子p的原创 2017-11-02 19:29:35 · 330 阅读 · 0 评论 -
[2017纪中10-26]摘Galo 树型背包
题面 裸的树型背包。f[i][j]表示i的子树中选了j个的最优值。 O(n*k^2)+常数优化代码:#include<iostream>#include<cstdio>#define chkmax(a,b) a=max(a,b)#define ll long longusing namespace std;const int maxn=100010;int n,k,w[maxn],s原创 2017-10-26 16:19:15 · 368 阅读 · 0 评论 -
[2017纪中11-3]机房比教室好多了 博弈+树型DP
题面 先考虑出发点在x,先手玩以x为根这棵子树的答案。 首先不难证明,a[x]变大,不会变得更劣。 那我们考虑先手拿完一个石头后走向一个a[son]>=a[x]的儿子,这样肯定是不明智的,因为假如对手把你推回x,你当然不能和他一直这样推来推去(你肯定先死),所以你会选择去别的儿子,但这当然不如一开始就去别的儿子(因为a[x]更大)。 再考虑先手拿完一个石头后走向一个a[son]#includ原创 2017-11-03 21:31:12 · 352 阅读 · 0 评论 -
[联合集训6-18] 奥妮的大楼
问题转化就是给定nnn个二元组,每组中选出一个使得其互不相同,最大化另一个的和。 那么对于每个二元组我们对这两个值连一条无向边,现在的问题就是对每一条边定向使得每个点出度≤1≤1\le 1,并最大化每个点乘上其入度的和。 那么有解一定是若干个树和环套树,对于环套树的情况定向方式是唯一的,这样每个点贡献degi−1degi−1deg_i-1次,degidegideg_i表示其度数;对于树的情况根...原创 2018-06-20 20:54:11 · 277 阅读 · 0 评论