●BZOJ 2500 幸福的道路
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=2500
题解:
DFS,单调队列
首先有一个结论,距离树上某一个点最远的点一定是树的直径的一个端点。
然后就3个DFS求出直接并得到D[i]数组表示i点到最远的点的距离。
然后就用两个单调队列分别维护一个单减的最大值和一个单增的最小值,
以便求出以i位置结尾的最长合法区间。
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 1000500
#define rint register int
using namespace std;
struct Edge{
int to[MAXN*2],val[MAXN*2],nxt[MAXN*2],head[MAXN],ent;
Edge(){ent=2;}
void Adde(int &u,int &v,int &w){
to[ent]=v; val[ent]=w; nxt[ent]=head[u]; head[u]=ent++;
to[ent]=u; val[ent]=w; nxt[ent]=head[v]; head[v]=ent++;
}
}E;
int D[MAXN];
int N,M,d1,d2,val;
char gc(){
//return getchar();
static char s[300005];
static int bit=300000,p=0,len=0;
if(p>=len) len=fread(s,1,bit,stdin),s[len]=EOF,p=0;
return s[p++];
}
void read(int &x){
static int sn; static char ch;
x=0; sn=1; ch=gc();
while(ch<'0'||'9'<ch){if(ch=='-')sn=-1;ch=gc();}
while('0'<=ch&&ch<='9'){x=x*10+ch-'0';ch=gc();}
x=x*sn;
}
void cmax(int &a,int b){
if(a<b) a=b;
}
void dfs(int u,int fa,int len,int &d){
if(len>=val) d=u,val=len;
cmax(D[u],len);
for(int i=E.head[u];i;i=E.nxt[i]){
if(E.to[i]==fa) continue;
dfs(E.to[i],u,len+E.val[i],d);
}
}
int solve(){
static int qmx[MAXN],qmn[MAXN],lmx=1,rmx=0,lmn=1,rmn=0,ANS=0,p=1;
for(int i=1;i<=N;i++){
while(lmx<=rmx&&D[qmx[rmx]]<=D[i]) rmx--;
while(lmn<=rmn&&D[qmn[rmn]]>=D[i]) rmn--;
qmx[++rmx]=i; qmn[++rmn]=i;
while(D[qmx[lmx]]-D[qmn[lmn]]>M){
if(qmx[lmx]<qmn[lmn]) p=qmx[lmx]+1,lmx++;
else p=qmn[lmn]+1,lmn++;
}
cmax(ANS,i-p+1);
}
return ANS;
}
int main(){
read(N); read(M);
for(rint i=2,f,d;i<=N;i++)
read(f),read(d),E.Adde(f,i,d);
val=0; dfs(1,0,0,d1);
val=0; dfs(d1,0,0,d2);
val=0; dfs(d2,0,0,d1);
printf("%d",solve());
return 0;
}
●BZOJ 2500 幸福的道路的更多相关文章
- [BZOJ 2500] 幸福的道路
照例先贴题面(汪汪汪) 2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 368 Solved: 145[Submit][Sta ...
- [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案
考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...
- bzoj 2500 幸福的道路 树上直径+set
首先明确:树上任意一点的最长路径一定是直径的某一端点. 所以先找出直径,求出最长路径,然后再求波动值<=m的最长区间 #include<cstdio> #include<cst ...
- BZOJ 2500 幸福的道路(race) 树上直径+平衡树
structHeal { priority_queue<int> real; priority_queue<int> stack; void push(int x){ real ...
- 【BZOJ】【2500】幸福的道路
树形DP+单调队列优化DP 好题(也是神题……玛雅我实在是太弱了TAT,真是一个250) 完全是抄的zyf的……orz我还是退OI保平安吧 第一步对于每一天求出一个从第 i 个点出发走出去的最长链的长 ...
- 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 ...
- [Bzoj2500]幸福的道路(树上最远点)
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 474 Solved: 194[Submit][Status][Discuss ...
- 【BZOJ2500】幸福的道路 树形DP+RMQ+双指针法
[BZOJ2500]幸福的道路 Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的 ...
随机推荐
- 20162321王彪-实验二-Java面向对象程序设计
实验二Java面向对象程序设计 实验内容一 初步掌握单元测试和TDD 什么是单元测试:单元测试时开发者编写的一小段代码,用于检测被测代码的一个很小的,很明确的功能是否正确.执行单元测试,是为了证明某段 ...
- 201621123025《Java程序设计》第1周学习总结
201621123025<Jave程序设计>第一周学习总结 1.本章学习总结 对于java这门课程,如果不会编码那么会很难学会如何去使用它,而在大一的一二学期的专业课--C语言和数据结构我 ...
- RE:1054652545 - 论自己是如何蠢死的
1.Java web 项目中 login/list 文件夹中return "login/list" 反复读取不到对应的jsp文件 一周后检查出来的原因上一级文件夹login前面多出 ...
- .Net Core MongoDB 简单操作。
一:MongoDB 简单操作类.这里引用了MongoDB.Driver. using MongoDB.Bson; using MongoDB.Driver; using System; using S ...
- php函数var_dump() 、print_r()、echo()
var_dump() 能打印出类型 print_r() 只能打出值 echo() 是正常输出... 需要精确调试的时候用 var_dump(); 一般查看的时候用 print_r() 另外 , ech ...
- ubuntu启动报/root/.profile mesg:ttyname failed错误的解决办法
修改/root/.profile文件,如下命令 sudo gedit /root/profile 将文中的最后一行mesg n修改成tty -s && mesg n
- Struts2 之值栈
值栈(ValueStack) http://www.cnblogs.com/bgzyy/p/8639893.html 这是我的有关 struts2 的第一篇文章,对于里面我们说到的一个 struts2 ...
- SpringCloud的DataRest(三)
一.进阶配置定义 二.定制显示内容和控制方法使用 1.控制显示的内容 如果想让输出显示的数据始终按我们定义的格式显示: 配置之后返回的JSON数据会按照ListApp定义的数据格式进行输出 2.屏蔽自 ...
- 译《Time, Clocks, and the Ordering of Events in a Distributed System》
Motivation <Time, Clocks, and the Ordering of Events in a Distributed System>大概是在分布式领域被引用的最多的一 ...
- Mac里安装配置Jdk
#下载jdk7的mac版 #官网下载地址http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.h ...