原题链接
\(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]\)
发现可以直接通过把数组右移直接把一个儿子的信息继承过来,又因为转移是跟深度相关的,那么我们直接把长儿子的信息继承过来就好了,然后暴力合并短儿子的信息
这样的时间复杂度都是\(O(n)\)的,怎么证明?直接继承长儿子的信息通过指针可以做到\(O(1)\),然后每条长链只会在顶端被合并,而长链的长度和是\(O(n)\),于是总复杂度就\(O(n)\)啦
空间复杂度的证明同理
代码如下

#include <algorithm>
#include  <iostream>
#include   <cstdlib>
#include   <cstring>
#include    <cstdio>
#include    <string>
#include    <vector>
#include     <cmath>
#include     <ctime>
#include     <queue>
#include       <map>
#include       <set>using namespace std;#define IINF 0x3f3f3f3f3f3f3f3fLL
#define ull unsigned long long
#define pii pair<int, int>
#define uint unsigned int
#define mii map<int, int>
#define lbd lower_bound
#define ubd upper_bound
#define INF 0x3f3f3f3f
#define vi vector<int>
#define ll long long
#define mp make_pair
#define pb push_back#define N 1000000struct Edge {int next, to;
}e[2*N+5];int n;
int head[N+5], eid, len[N+5], longson[N+5];
int memory[N+5], ans[N+5];void addEdge(int from, int to) {e[++eid].next = head[from];e[eid].to = to;head[from] = eid;
}void dfs1(int u, int fa) {for(int i = head[u], v; i; i = e[i].next) {v = e[i].to;if(v == fa) continue;dfs1(v, u);if(len[longson[u]] < len[v]) longson[u] = v;}len[u] = len[longson[u]]+1;
}void dp(int u, int fa, int *f) {ans[u] = 0;f[0] = 1;int *g;if(longson[u]) {g = f+1;dp(longson[u], u, g);if(g[ans[longson[u]]] > f[ans[u]] || (g[ans[longson[u]]] == f[ans[u]] && ans[longson[u]] < ans[u]))ans[u] = ans[longson[u]]+1;}g = f+len[u];for(int i = head[u], v; i; i = e[i].next) {v = e[i].to;if(v == fa || v == longson[u]) continue;dp(v, u, g);for(int j = 1; j <= len[v]; ++j) {f[j] += g[j-1];if(f[j] > f[ans[u]] || (f[j] == f[ans[u]] && j < ans[u]))ans[u] = j;}}
}int main() {scanf("%d", &n);for(int i = 1, x, y; i < n; ++i) {scanf("%d%d", &x, &y);addEdge(x, y), addEdge(y, x);}dfs1(1, 0);dp(1, 0, memory);for(int i = 1; i <= n; ++i) printf("%d\n", ans[i]);return 0;
}

转载于:https://www.cnblogs.com/dummyummy/p/10946218.html

CF1009F Dominant Indices——长链剖分优化DP相关推荐

  1. 【luogu CF1009F】Dominant Indices(长链剖分优化DP)

    Dominant Indices 题目链接:luogu CF1009F 题目大意 给你一棵以 1 为根的树,设 d(u,x) 为 u 子树总到 u 距离为 x 的点数. 然后要你对于每个点 x 都要求 ...

  2. 长链剖分优化树形dp

    apio铁牌告辞(开场想打暴力然后gedit码代码5个小时没写完三题最低档暴力真是快乐),听课也就学到了一丢丢这个东西. 模板题: https://www.luogu.org/problemnew/s ...

  3. 中心城镇问题(长链剖分优化树形dp)

    problem 给定 nnn 个城市,n−1n-1n−1 条道路,形成一棵树.每座城市上的人口为 wiw_iwi​. 现要修建若干个中心城镇,满足任意两个中心城镇之间的距离严格大于 kkk. 最大化中 ...

  4. P3565 [POI2014]HOT-Hotels(树形dp+长链剖分)

    P3565 [POI2014]HOT-Hotels 参考题解 题目大意: 给定一棵树,在树上选 3 个点,要求两两距离相等,求方案数. 三个点树上两两距离为d存在下面两种情况 某个点三个子树(保证该点 ...

  5. 【BZOJ4543】Hotel加强版【神仙树形dp】【长链剖分】

    题意:给一棵 nnn 个点的树,求两两距离相等的三元组个数. n≤105n\leq 10^5n≤105 显然相当于是找一个点到这三个点距离相等.子树内和子树外到当前点的距离为某个值的点的个数可以长链剖 ...

  6. 【十二省联考2019】希望【点边容斥】【换根dp】【长链剖分】【线性数据结构】【回退数据结构】【离线逆元】

    题意:给一棵树,两个参数 k,Lk,Lk,L,需要选择 kkk 个连通块,使得这 kkk 个连通块存在一个公共点,且该公共点到 kkk 个连通块内的任意一点的距离不超过 LLL,求方案数 模 9982 ...

  7. 树链剖分之长链剖分 详解 题目整理

    树链剖分 题目中出现的树链剖分一般分为两种,重链剖分和长链剖分 重链剖分:选择子树最大的儿子, 将其归入当前点所在 的同一条重链 长链剖分:选择向下能达到的深 度最深的儿子,将其归 入当前点所在的同一 ...

  8. BZOJ4543/BZOJ3522 [POI2014]Hotel加强版(长链剖分)

    题目好神仙--这个叫长链剖分的玩意儿更神仙-- 考虑dp,设\(f[i][j]\)表示以\(i\)为根的子树中到\(i\)的距离为\(j\)的点的个数,\(g[i][j]\)表示\(i\)的子树中有\ ...

  9. 【COGS2652】秘术「天文密葬法」(长链剖分,分数规划)

    永琳需要协助紫解决异变! 在某个满月的夜晚,幻想乡的结界出现了异常,虽然目前还没有找到原因,不过有一点可以肯定的是,这次异变一定和满月有关.间隙妖怪紫在试图修复结界时需要永琳帮她排除满月产生的干扰,为 ...

  10. 【COGS2652】—天文密葬法(分数规划+长链剖分)

    COGS传送门(已咕咕) 一眼分数规划 二分一个midmidmid,找到∑ai−∑bi∗mid\sum{a_i}-\sum{b_i}*mid∑ai​−∑bi​∗mid最小的路径,如果路径长大于0,下界 ...

最新文章

  1. [置顶] Hibernate从入门到精通(十一)多对多双向关联映射
  2. 微型计算机48MHz辐射超,2012职称计算机考试题理论题库
  3. 真正的编程高手-----激励计算机专业的大学生
  4. Codeforces Beta Round #9 (Div. 2 Only)【未完结】
  5. SpringBoot依赖注入
  6. C语言试题五十八之请编写函数fun,:计算并输出下列多项式的值(sn=1+1/1!+1/2!+1/3!+1/4!+…+1/n! )
  7. c语言判断字符配对,【C语言】判断花括号{}是否匹配
  8. Python 3 学习——函数扩展and迭代器生成器装饰器
  9. python文字游戏 生成数字菜单_python自学日记5——文字游戏
  10. DMA双缓冲传输意义
  11. STTN、DSTT、FuseFormer总结(它们改进了什么?)
  12. vue组件系列3、查询下载
  13. Visio.2010.Premium.简体中文VOL版
  14. uniapp将h5链接打包成安卓
  15. 一些关于H.264的术语
  16. 灵格斯!优秀的翻译软件!!!
  17. Cannot find module ‘node-sass‘问题解决
  18. 阿里云域名配置以及https证书(ssl证书)配置
  19. Spring Data JPA 多条件判空查询
  20. 时间“照妖镜”のmanic time

热门文章

  1. SQL查询本年每月的数据
  2. LeetCode刷题之路:714. 买卖股票的最佳时机含手续费
  3. Python爬虫实战之豆瓣音乐、微打赏、阳光电影(附代码)
  4. 从人类行为的角度理解状态管理
  5. running Apollo on orin(arm64/aarch64) 移植记录
  6. linux不关机失败新存储,使用 molly-guard 保护你的 Linux/Unix 机器不会被错误地关机/重启 | Linux 中国...
  7. 摸鱼系列,一键生成TS+Interface+接口
  8. html头像与文字一行,如何正确地为头像图像上的文本编写HTML和CSS?
  9. 事业单位计算机技术岗工资,同在一家事业单位,一个技术岗一个管理岗,工资却不同,为什么...
  10. 个人学习成长记录之Redis基础