【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分
原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html
题目描述
输入
输出
样例输入
3 2
1 1
1 3
样例输出
3
题解
树形dp+倍增RMQ+二分,这完全是两道题拼成一道题的啊。。。
先用树形dp求出到某个点最大距离。
设fst[x]表示以x为根的树中点到x的最大距离,fnd[x]表示以x为根的树中,除去fst[x]所在子树以外其余子树中的点到x的最大距离。
这里比较难想,待会分析。
第一次dfs可以直接处理好deep、fst和fnd。
然后考虑如何用x递推出x的儿子y的最远距离。
那么对于y,有2种情况可能构成到y距离最大:在y的父树中、在y的子树中,在y的父树中包括在x的父树中和在x除y以外的子树中。
在y的子树中即为fst[y],在x除y以外的子树中,需要判断y是否为构成到点x的最大距离的点所在的子树:如果是fst则取fnd,否则取fst。
这样就能够dp求出到某个点最大距离。
然后对于每个点,二分后边的位置,RMQ预处理,O(1)求出区间极差,判断一下即可。
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- int head[1000010] , to[2000010] , next[2000010] , cnt , n , k , p , q;
- int len[2000010] , fst[1000010] , fnd[1000010] , ff[1000010] , deep[1000010] , minn[1000010][22] , maxn[1000010][22] , log[1000010];
- void add(int x , int y , int z)
- {
- to[++cnt] = y , len[cnt] = z , next[cnt] = head[x] , head[x] = cnt;
- }
- void dfs1(int x , int fa)
- {
- int i , y;
- for(i = head[x] ; i ; i = next[i])
- {
- y = to[i];
- if(y != fa)
- {
- deep[y] = deep[x] + len[i];
- dfs1(y , x);
- if(fst[y] + len[i] > fst[x]) fnd[x] = fst[x] , fst[x] = fst[y] + len[i];
- else if(fst[y] + len[i] > fnd[x]) fnd[x] = fst[y] + len[i];
- }
- }
- }
- void dfs2(int x , int fa)
- {
- int i , y;
- for(i = head[x] ; i ; i = next[i])
- {
- y = to[i];
- if(y != fa)
- {
- if(fst[x] - len[i] == fst[y]) ff[y] = max(ff[x] + len[i] , fnd[x] + len[i]);
- else ff[y] = max(ff[x] + len[i] , fst[x] + len[i]);
- dfs2(y , x);
- }
- }
- }
- int getsub(int l , int r)
- {
- int k = log[r - l + 1];
- return max(maxn[l][k] , maxn[r - (1 << k) + 1][k]) - min(minn[l][k] , minn[r - (1 << k) + 1][k]);
- }
- int find(int t)
- {
- int l = t , r = n , mid , ans;
- while(l <= r)
- {
- mid = (l + r) >> 1;
- if(getsub(t , mid) <= k) ans = mid , l = mid + 1;
- else r = mid - 1;
- }
- return ans;
- }
- int main()
- {
- int i , j , x , y , ans = -1;
- scanf("%d%d" , &n , &k);
- for(i = 2 ; i <= n ; i ++ ) scanf("%d%d" , &x , &y) , add(i , x , y) , add(x , i , y);
- dfs1(1 , 0) , dfs2(1 , 0);
- for(i = 1 ; i <= n ; i ++ ) maxn[i][0] = minn[i][0] = max(ff[i] , fst[i]);
- for(i = 2 ; i <= n ; i ++ ) log[i] = log[i >> 1] + 1;
- for(i = 1 ; i <= log[n] ; i ++ )
- for(j = 1 ; j <= n - (1 << i) + 1 ; j ++ )
- maxn[j][i] = max(maxn[j][i - 1] , maxn[j + (1 << (i - 1))][i - 1]) , minn[j][i] = min(minn[j][i - 1] , minn[j + (1 << (i - 1))][i - 1]);
- for(i = 1 ; i <= n - p + 1 ; i ++ )
- x = find(i) , ans = max(ans , find(i) - i + 1);
- printf("%d\n" , ans);
- return 0;
- }
【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分的更多相关文章
- bzoj2500幸福的道路 树形dp+单调队列
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 434 Solved: 170[Submit][Status][Discuss ...
- [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案
考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...
- 【BZOJ2500】幸福的道路 树形DP+RMQ+双指针法
[BZOJ2500]幸福的道路 Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的 ...
- (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- 【bzoj2500】幸福的道路 树形dp+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- 重建道路 树形DP
重建道路 树形DP 给一棵树,问最少断多少边使得这棵树树最终只有\(p\)个节点 设计dp状态\(f[u][i][j]\)表示节点\(u\),到第\(i\)个儿子,使\(j\)个节点分离,但是不分离 ...
- bzoj2500: 幸福的道路(树形dp+单调队列)
好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...
- Codeforces 418d Big Problems for Organizers [树形dp][倍增lca]
题意: 给你一棵有n个节点的树,树的边权都是1. 有m次询问,每次询问输出树上所有节点离其较近结点距离的最大值. 思路: 1.首先是按照常规树形dp的思路维护一个子树节点中距离该点的最大值son_di ...
- BZOJ2500: 幸福的道路
题解: 一道不错的题目. 树DP可以求出从每个点出发的最长链,复杂度O(n) 然后就变成找一个数列里最长的连续区间使得最大值-最小值<=m了. 成了这题:http://www.cnblogs.c ...
随机推荐
- 在jdbc基础上进阶一小步的C3p0 连接池(DBCP 不能读xml配置文件,已淘汰) 和DBUtils 中两个主要类QueryRunner和ResultSetHandler的使用
首先看C3p0这个连接池,最大优势可以自动读取默认的配置文件 <?xml version="1.0" encoding="UTF-8"?> < ...
- git和svn的混用
服务器上的项目是使用svn进行管理的. 本来本地的项目也是通过svn进行管理的,但是后来使用svn的分支功能进行项目的测试/新功能等等时,总是会出现各种各样的问题,遂转投git. 因为git的分支机制 ...
- docker官方仓库下载镜像
官方仓库镜像地址:https://hub.docker.com/search/ 以下载mysql为例 进入到详情页后我们看到有很多Tags 我们选择5.7.25版本进行下载 # docker pull ...
- 文件权限管理命令chmod,chown与文本搜索命令grep
1.复制/etc/skel目录为/home/tuser1,要求/home/tuser1及其内部文件的属组和其它用户均没有任何访问权限. [root@bogon home]# cp -r /etc/sk ...
- OpenLDAP部署目录服务
文档信息 目 的:搭建一套完整的OpenLDAP系统,实现账号的统一管理. 1:OpenLDAP服务端的搭建 ...
- 【LeetCode #179】Largest Number 解题报告
原题链接:Largest Number 题目描述: Given a list of non negative integers, arrange them such that they form th ...
- 深入理解restfulAPI和 Oauth2.0(精简版)
一.restfulAPI 1.解释: restfulAPI协议,我们也可以说是一套API接口编写风格. 它被现在很多企业所认可和默认,是一套成俗的API接口编写方案. 2.restfulAPI之资源 ...
- Linux下 VI 编辑器操作
VI编辑器的三种模式:命令模式.输入模式.末行模式. 1.命令模式:vi启动后默认进入的是命令模式,从这个模式使用命令可以切换到另外两种模式,同时无论在何种模式下,[Esc]键都可以回到命令模式.在命 ...
- Java实现Avl树
Avl树即左右子树的深度[高度]相差不可超过1,所以在插入key的时候,就会出现需要旋转[更改根节点]的操作 下面是源代码: /* the define of avltree's node */ cl ...
- 笔记-爬虫-XPATH
笔记-爬虫-XPATH 1. xpath XPath是W3C的一个标准.它最主要的目的是为了在XML1.0或XML1.1文档节点树中定位节点所设计.目前有XPath1.0和XPath2.0两 ...