原题链接 \(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]\) 发现可以直接通过把数组右移直接把一个儿子的信息继承过来,又因为转…
题目传送门 https://codeforces.com/contest/1009/problem/F 题解 长链剖分的板子吧. 令 \(dp[x][i]\) 表示 \(x\) 的子树中的深度为 \(i\) 的点的个数. 那么转移的时候就是一般的长链剖分指针移位来维护. 然后就可以在转移的时候通过被转移的那一位被更新的值来更新当前这个点的最优解就可以了. 时间复杂度 \(O(n)\). #include<bits/stdc++.h> #define fec(i, x, y) (int i =…
F. Dominant Indices 题意: 给一颗无向树,根为1.对于每个节点,求其子树中,哪个距离下的节点数量最多.数量相同时,取较小的那个距离. 题目: 这类题一般的做法是树上的启发式合并,复杂度是O(nlogn).但由于这题所求的信息与深度有关,因此可以使用长链剖分的技巧,复杂度可以是O(n). 长链剖分可以维护以深度为下标的信息.先预处理,以深度为依据,标记长儿子.维护答案时,对于每个节点,O(1)继承其长儿子的信息.然后暴力合并其他儿子.则时间复杂度是所有长链的长度之和,即O(n)…
题目:http://codeforces.com/contest/1009/problem/F 也可以用 dsu on tree 的做法,全局记录一个 dep,然后放进堆里,因为字典序要最小,所以再记一个第二关键字 dep[u]: 长链剖分是 O(n) 的,因为如果 O(1) 继承重儿子(长儿子),对其他儿子枚举长度,那么每个点只会在向上第一次合并到重儿子时被枚举一次,所以总体 O(n): 然而不能开 f[1e6][1e6] 的数组,考虑到因为自己继承重儿子,所以数组有很大一部分是共用的,如果真…
题目链接 \(O(n^2)\)的\(DP\)很容易想,\(f[u][i]\)表示在\(u\)的子树中距离\(u\)为\(i\)的点的个数,则\(f[u][i]=\sum f[v][i-1]\) 长链剖分. \(O(1)\)继承重儿子的信息,再暴力合并其他轻儿子的信息,时间复杂度是线性的. 继承重儿子用指针实现,非常巧妙. #include <cstdio> int xjc; char ch; inline int read(){ xjc = 0; ch = getchar(); while(c…
传送门 代码: 长链剖分好题. 题意:给你一棵树,问树上选三个互不相同的节点,使得这个三个点两两之间距离相等的方案数. 思路: 先考虑dpdpdp. fi,jf_{i,j}fi,j​表示iii子树中离iii距离为jjj的点数,gi,jg_{i,j}gi,j​表示iii子树中所有满足dist(lca(u,v),i)−dist(lca(u,v),i)=jdist(lca(u,v),i)-dist(lca(u,v),i)=jdist(lca(u,v),i)−dist(lca(u,v),i)=j的点对数…
[BZOJ4543][POI2014]Hotel加强版 Description 同OJ3522数据范围:n<=100000 Sample Input 7 1 2 5 7 2 5 2 3 5 6 4 5 Sample Output 5 题解:很神的做法. 用f[x][a]表示x子树中有多少个深度为a的点,g[x][a]表示x子树中有多少到lca距离=d的点对,且lca的深度为d-a.那么容易得到转移方程: f[x][a]+=f[y][a-1]g[x][a]+=g[y][a+1]+f[x][a]*f…
正题 题目链接:https://www.luogu.com.cn/problem/P7581 题目大意 给出\(n\)个点的有边权有根树,\(m\)次询问一个节点\(x\)的所有\(k\)级儿子两两之间路径长度. \(1\leq n,m\leq 10^6\) 解题思路 有根长剖,无根点分治.所以这题应该是长剖(?,先离线一下询问 然后略微分析一下,两两的路径长度所以需要合并两棵子树向上的路径,合并的时候又需要记录子树的\(k\)级儿子到该节点的距离和,还有\(k\)级儿子个数. 所以要记录三个东…
点此看题面 大致题意: 设\(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}\] 但这样显然跑不过,要优化. 长链剖分…
[CF1009F]Dominant Indices(长链剖分) 题面 洛谷 CF 翻译: 给定一棵\(n\)个点,以\(1\)号点为根的有根树. 对于每个点,回答在它子树中, 假设距离它为\(d\)的点有\(f_d\)个,求最大的\(f_d\),并且输出\(d\),如果有多个\(f_d\)相同,输出最小的\(d\). 题解 这个东西和深度相关,很显然可以直接用长链剖分维护,时间复杂度\(O(N)\) 这道题目要维护的东西其实也很类似于\(dsu\ on\ tree\),但是复杂度会多个\(log…