传送门 考虑直接推式子不用优化怎么做. 显然每一个二进制位分开计算贡献就行. 即记录fi,jf_{i,j}fi,j​表示距离iii这个点不超过jjj的点的每个二进制位的0/10/10/1个数. 但直接存是会爆炸的. 考虑到每个数只会被用一次,所以可以考虑主席树那种复用信息的思想来继承长链后代的信息,然后短链直接暴力统计贡献就行. 由于ldxldxldx蒟蒻是口胡选手只会暴力写法,因此正解差不多是照着标程写的233. 细节较多,用指针维护比较自然一些. 代码…
点此看题面 大致题意: 设\(d(x,y)\)表示\(x\)子树内到\(x\)距离为\(y\)的点的个数,对于每个\(x\),求满足\(d(x,y)\)最大的最小的\(y\). 暴力\(DP\) 首先让我们来思考如何暴力\(DP\). 这应该还是比较简单的吧. 直接设\(f_{x,i}\)表示在\(x\)的子树内,到\(x\)的距离为\(i\)的点的个数. 则不难推出转移方程: \[f_{x,0}=1,f_{x,i}=\sum f_{son_x,i-1}\] 但这样显然跑不过,要优化. 长链剖分…
原题链接 \(EDU\)出一道长链剖分优化\(dp\)裸题? 简化版题意 问你每个点的子树中与它距离为多少的点的数量最多,如果有多解,最小化距离 思路 方法1. 用\(dsu\ on\ tree\)做到\(O(nlogn)\) 方法2. 考虑\(dp\),也就是设\(f[u][d]\)表示以\(u\)为根的子树中有多少个点与它的距离为\(j\),则转移如下: \(f[u][0]=1\),\(f[u][d]+=f[v][d-1]\) 发现可以直接通过把数组右移直接把一个儿子的信息继承过来,又因为转…
传送门 长链剖分优化dpdpdp水题. 题意简述:给一棵树,mmm次询问,每次给一个点aaa和一个值kkk,询问满足如下条件的三元组(a,b,c)(a,b,c)(a,b,c)的个数. a,b是c的祖先 a,b的距离不超过k 思路: 考虑单独处理每一个询问怎么做. 显然a,ba,ba,b的位置关系有两种. bbb是aaa的祖先,此时ccc一定在aaa子树中,这种情况的三元组个数是(sizea−1)∗min(k,depa−1)(size_a-1)*min(k,dep_a-1)(sizea​−1)∗m…
首先,重链剖分我们有所认识,在dsu on tree和数据结构维护链时我们都用过他的性质. 在这里,我们要介绍一种新的剖分方式,我们求出这个点到子树中的最长链长,这个链长最终从哪个儿子更新而来,那个儿子就是所谓的“重儿子”,也可以叫长儿子. 我们的做法就是,在统计一个点的信息时,对于重儿子,我们直O(1)接继承它的答案(这里有指针技巧,只能看代码,不可言传),对于轻儿子我们暴力统计. 复杂度分析:一个点被计算,最多只会在作为重链上的点时被继承一次,在重链顶端时被暴力统计一次.所以最终复杂度是O(…
传送门 显然如果AAA到BBB或者CCC到DDD走的不是最短路一定是有一段路径重合了,于是可以O(n2)bfsO(n^2)bfsO(n2)bfs出两点之间的最短距离然后枚举两个点作为重合的端点来更新答案. 然而考试的时候只枚举了最短路上的点没被卡成功踩标算? 如果数据强一点今天多半又垫底了233. 我果然还是太菜了啊! 代码…
传送门 考试5分钟写完. 如果没这题今天多半爆零了(汗 直接二分出合法的转移范围. 然后用后面的状态更新前面的就可以了. 代码…
传送门 跟这道题差不多. 只不过是让权值小的儿子做权值大的儿子的父亲而已. 代码…
题意参见BZOJ3522 n<=100000 数据范围增强了,显然之前的转移方程不行了,那么不妨换一种. 因为不能枚举根来换根DP,那么我们描述的DP方程每个点要计算三个点都在这个点的子树内的方案数. 设f[i][j]表示i节点子树中与i距离为j的点的个数. g[i][j]表示i节点子树中有g[i][j]对点满足每对点距离他们lca的距离都是d,他们lca距离i节点为d-j 也就是说现在已经找到两个节点了,需要再在没遍历的i的子树中找到一个距离i为j的点. 那么很容易得到转移方程: ans+=f…
题目链接 弱化版:https://www.cnblogs.com/SovietPower/p/8663817.html. 令\(f[x][i]\)表示\(x\)的子树中深度为\(i\)的点的个数,\(g[x][i]\)表示\(x\)子树中,满足\(u,v\)到\(LCA(u,v)\)的距离都是\(d\),且到\(x\)的距离为\(d-i\)的点对\((u,v)\)个数.(就是不以\(x\)作为三个点的中心位置,那样就没法算了) 如图 那么就可以由\(g[x][i]\)与另一棵子树的\(f[y][…