bzoj 2500 幸福的道路 树上直径+set
首先明确:树上任意一点的最长路径一定是直径的某一端点。
所以先找出直径,求出最长路径,然后再求波动值<=m的最长区间
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<ctime>
#include<set>
#define N 1000005
using namespace std; int fa[N],cal[N],dis[2][N],d[N]; int e=1,head[N]; struct edge{
int u,v,w,next;
}ed[N]; void add(int u,int v,int w){
ed[e].u=u; ed[e].v=v; ed[e].w=w;
ed[e].next=head[u]; head[u]=e++;
} int L,R,it,maxn; bool bo[N]; void dfs(int x,int len){
bo[x]=1;
if(len>maxn) it=x,maxn=len;
if(!bo[fa[x]]) dfs(fa[x],len+cal[x]);
for(int i=head[x];i;i=ed[i].next){
if(!bo[ed[i].v])
dfs(ed[i].v,len+ed[i].w);
}
} int q[N],h,t; void bfs(int x,int wh){
bo[x]=1;int now,v,w; dis[wh][x]=0;
q[1]=x; h=t=1;
while(h<=t){
now=q[h++];
if(fa[now]&&!bo[fa[now]]&&dis[wh][fa[now]]<dis[wh][now]+cal[now]){
dis[wh][fa[now]]=dis[wh][now]+cal[now];
bo[fa[now]]=1; q[++t]=fa[now];
}
for(int i=head[now];i;i=ed[i].next){
v=ed[i].v; w=ed[i].w;
if(!bo[v]&&dis[wh][v]<dis[wh][now]+w){
dis[wh][v]=dis[wh][now]+w;
bo[v]=1; q[++t]=v;
}
}
}
} int n,m; int main()
{
//freopen("race.in","r",stdin);
//freopen("race.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=2;i<=n;i++){
scanf("%d%d",&fa[i],&cal[i]);
add(fa[i],i,cal[i]);
}
maxn=0; memset(bo,0,sizeof bo); dfs(1,0); L=it;
maxn=0; memset(bo,0,sizeof bo); dfs(L,0); R=it;
memset(bo,0,sizeof bo); bfs(L,0);
memset(bo,0,sizeof bo); bfs(R,1);
for(int i=1;i<=n;i++) d[i]=max(dis[0][i],dis[1][i]); //printf("%0.2lf\n",(double)clock()/CLOCKS_PER_SEC); multiset<int > ss;
int dd,xx,ll=1,ans=0;
for(int i=1;i<=n;i++){
ss.insert(d[i]);
dd=*(--ss.end());
xx=*(ss.begin());
while(dd-xx>m)
ss.erase(ss.find(d[ll++])),dd=*(--ss.end()),xx=*(ss.begin());
ans=max(ans,i-ll+1);
} printf("%d\n",ans);
return 0;
}
然而我打的依旧很蠢。。QAQ
bzoj 2500 幸福的道路 树上直径+set的更多相关文章
- [BZOJ 2500] 幸福的道路
照例先贴题面(汪汪汪) 2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 368 Solved: 145[Submit][Sta ...
- BZOJ 2500 幸福的道路(race) 树上直径+平衡树
structHeal { priority_queue<int> real; priority_queue<int> stack; void push(int x){ real ...
- ●BZOJ 2500 幸福的道路
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2500 题解: DFS,单调队列 首先有一个结论,距离树上某一个点最远的点一定是树的直径的一个 ...
- [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案
考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...
- 【BZOJ】【2500】幸福的道路
树形DP+单调队列优化DP 好题(也是神题……玛雅我实在是太弱了TAT,真是一个250) 完全是抄的zyf的……orz我还是退OI保平安吧 第一步对于每一天求出一个从第 i 个点出发走出去的最长链的长 ...
- [Bzoj2500]幸福的道路(树上最远点)
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 474 Solved: 194[Submit][Status][Discuss ...
- BZOJ2500: 幸福的道路
题解: 一道不错的题目. 树DP可以求出从每个点出发的最长链,复杂度O(n) 然后就变成找一个数列里最长的连续区间使得最大值-最小值<=m了. 成了这题:http://www.cnblogs.c ...
- bzoj2500幸福的道路 树形dp+单调队列
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 434 Solved: 170[Submit][Status][Discuss ...
- BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划
BZOJ 4753 [Jsoi2016]最佳团体 | 树上背包 分数规划 又是一道卡精度卡得我头皮发麻的题-- 题面(--蜜汁改编版) YL大哥是24OI的大哥,有一天,他想要从\(N\)个候选人中选 ...
随机推荐
- 《转》xcode创建一个工程的多个taget,便于测试和发布多个版本
背景:很多时候,我们需要在一个工程中创立多个target,也就是说我们希望同一份代码可以创建两个应用,放到模拟器或者真机上,或者是,我们平时有N多人合作开发,当测试的时候,在A这里装了一遍测A写的那块 ...
- GitHub Desktop 如何创建本地仓库,上传代码,删除仓库
1.创建本地仓库 2.打开本地仓库,将要上传的文件放到本地仓库. 3.ctrl+p push仓库或者菜单栏Repository下push也可以用右上角的publish respository 4.左边 ...
- Implement int sqrt(int x).
自己设计函数,实现求根号.x是非负整数. Input: 8 Output: 2 当开出根号后有小数,则省略小数部分.. 思路:只要找到一个数a,a*a<=x而且(a+1)*(a+1)>x, ...
- 二叉查找树之 Java的实现
参考:http://www.cnblogs.com/skywang12345/p/3576452.html 二叉查找树简介 二叉查找树(Binary Search Tree),又被称为二叉搜索树.它是 ...
- 7. Selenium的基本使用
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 32.0px "PingFang SC" } span.s1 { font: 32.0p ...
- python笔记:#012#函数
函数基础 目标 函数的快速体验 函数的基本使用 函数的参数 函数的返回值 函数的嵌套调用 在模块中定义函数 01. 函数的快速体验 1.1 快速体验 所谓函数,就是把 具有独立功能的代码块 组织为一个 ...
- mysql数据库的安装步骤
Redhat6.5 1.准备工作 卸载使用rpm包安装的mysql-server.mysql软件包 安装自带的ncurses-devel包 rpm -ivh /mnt/Packages/ncurses ...
- 航遇项目react踩坑
1.iconfont应用: a.正常用法如下 <span className='iconfont' > iconfont的代码,例如: </span> b.react不能动态 ...
- JavaScrip对象
一.JavaScript对象概述 JavaScript 中的所有事物都是对象:字符串.数值.数组.函数...此外,JavaScript 允许自定义对象.JavaScript 提供多个内建对象,比如 S ...
- 纯干货!耗时1个月整理黑马程序员Java教程+笔记+配套工具
学习Java是不是很苦?找不到资料?不了解学习步骤?想要全面的线路图! 或者是找资料,前面免费,后面收费?工具软件要收费? 当当当~~今天就没有这个状态发生了!不信就证明给你看 1.学习路线图 2.J ...