【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;
}
转载于:https://www.cnblogs.com/GXZlegend/p/6825389.html
【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分相关推荐
- bzoj2500幸福的道路 树形dp+单调队列
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 434 Solved: 170 [Submit][Status][Discu ...
- 【BZOJ2500】幸福的道路 树形DP+RMQ+双指针法
[BZOJ2500]幸福的道路 Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的 ...
- P3994 高速公路 树形DP+斜率优化+二分
$ \color{#0066ff}{ 题目描述 }$ C国拥有一张四通八达的高速公路网树,其中有n个城市,城市之间由一共n-1条高速公路连接.除了首都1号城市,每个城市都有一家本地的客运公司,可以发车 ...
- LibreOJ #2478.「九省联考 2018」林克卡特树 树形dp+带权二分
题意 给出一棵n个节点的树和k,边有边权,要求先从树中选k条边,然后把这k条边删掉,再加入k条边权为0的边,满足操作完后的图仍然是一棵树.问新树的带权直径最大是多少. n,k≤3∗105n,k≤3∗1 ...
- 洛谷 P1272 重建道路(树形DP)
P1272 重建道路 题目描述 一场可怕的地震后,人们用N个牲口棚(1≤N≤150,编号1..N)重建了农夫John的牧场.由于人们没有时间建设多余的道路,所以现在从一个牲口棚到另一个牲口棚的道路是惟 ...
- 洛谷.4383.[八省联考2018]林克卡特树lct(树形DP 带权二分)
题目链接 \(Description\) 给定一棵边带权的树.求删掉K条边.再连上K条权为0的边后,新树的最大直径. \(n,K\leq3\times10^5\). \(Solution\) 题目可以 ...
- 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...
- 【BZOJ-2435】道路修建 (树形DP?)DFS
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MB Submit: 3115 Solved: 1002 [Submit][Sta ...
- 树形DP 洛谷P1272 道路重建
好久没有更新博客了 But!今天凌晨突然发现spli神竟然不可描述地......本dog受到上亿吨伤害,看来spli神是要向sdfzyhx学习啊!!! 于是今天又开始脑抽地写博客了. P1272 重建 ...
最新文章
- 趣谈网络协议笔记-一
- 1.封装WinMain至动态链接库
- 15行代码AC——习题5-5 复合词(Compound Words, UVa 10391)——解题报告
- 整理iOS9适配中出现的坑
- puppet 安装mysql_Puppet安装dashboard
- MQTT(2)---MQTT协议
- E: Malformed line 60 in source list /etc/apt/sources.list (dist parse)
- [USACO13OPEN]Luxury River Cruise【模拟】
- IDA Pro、OllyDbg、LordPE和UltraEdit简单实用实验
- 内存碎片的定义、种类、产生原因以及解决办法
- 哪吒之魔童降世视听语言影评_《哪吒之魔童降世》观后感——不用吹爆,但值得点赞...
- Python学习手册(致敬谢公子)
- Bugku - 代码审计 | md5函数
- 盘点2016最值得突击的七大海外市场:最后一年窗口期,不出海就出局!
- pycharm import 同路径下.py文件和文件夹报红解决方案
- JAVA如何分割出字符串中的数字?
- 智慧管廊综合管理系统设计方案
- python 英语词汇量_北大保安小哥英语词汇量一万五,会用Python编程,网友:北大保安都不会招我...
- Vivado入门之加法器的实现(从创建工程到上板验证)
- HTML5期末大作业:个人网页设计——易烊千玺6页(代码质量好) 学生DW网页设计作业源码 web课程设计网页规划与设计
热门文章
- Vue组件通信原理剖析(二)全局状态管理Vuex
- Vue中定义全局变量与常量的各种方式详解_vue.js_脚本之家
- 算法 --- 求两个集合的并集
- 多对多关联映射(双向)
- mysqlpump 备份文件压缩对比
- Android 布局以及优化资料汇总
- windwos 批处理重定向, 讲的策彻底
- G代码 机器人的CNC实现
- 【TensorFlow】——Windows10、pycharm、Python3.6.4中安装CPU和GPU两种版本的TensorFlow
- linux怎么切换不同版本的r,在linux中用同一个版本的R 同时安装 Seurat2 和 Seurat3