(noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列
Description
Input
Output
最长的连续锻炼天数
Sample Input
3 2
1 1
1 3
Sample Output
3
HINT
数据范围:
50%的数据N<=1000
80%的数据N<=100000
100%的数据N<=1000000
题解:
其实这题很水……全场切掉,但是自己很少写单调队列(几乎没写过),所以调了很久最后发现了数个傻逼错……搞了很久才对……
首先这题是树形DP+单调队列二合一,前半部分直接DP,设$F[i]$表示以$i$为根的子树里最长的距离,$G[i]$表示从$i$向上走到一个祖先再向下的最大值,直接两次dfs处理(转移的时候要记录一个次大值)。那么最大的幸福值就是$max(F[i],G[i])$;
后半部分注意到可选的区间是连续的,所以左右端点必定严格从左向右移动,所以可以用单调队列来维护,开两个单调队列维护区间最大最小值,记录当前区间大小即可(我也不知道我为什么能写出那么多傻逼错)
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
struct edge{
int v,w,next;
}a[];
int n,m,x,w,tot=,ans=,tmp=,head[],num[],f[],ff[],g[];
//queue<int>ql,qr;
int ql[],qr[],l1=,l2=,r1=-,r2=-;
void add(int u,int v,int w){
a[++tot].v=v;
a[tot].w=w;
a[tot].next=head[u];
head[u]=tot;
}
void dfs1(int u){
f[u]=ff[u]=;
for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v,w=a[tmp].w;
dfs1(v);
if(f[v]+w>f[u]){
ff[u]=f[u];
f[u]=f[v]+w;
}else if(f[v]+w>ff[u]){
ff[u]=f[v]+w;
}
}
}
void dfs2(int u){
for(int tmp=head[u];tmp!=-;tmp=a[tmp].next){
int v=a[tmp].v,w=a[tmp].w;
g[v]=g[u]+w;
if(f[v]+w==f[u])g[v]=max(g[v],ff[u]+w);
else g[v]=max(g[v],f[u]+w);
dfs2(v);
}
}
int main(){
memset(head,-,sizeof(head));
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++){
scanf("%d%d",&x,&w);
add(x,i,w);
}
dfs1();
dfs2();
for(int i=;i<=n;i++)num[i]=max(f[i],g[i]);
for(int i=;i<=n;i++){
while(l1<=r1&&num[i]<=num[ql[r1]])r1--;
ql[++r1]=i;
while(l2<=r2&&num[i]>=num[qr[r2]])r2--;
qr[++r2]=i;
while(num[qr[l2]]-num[ql[l1]]>m){
tmp=ql[l1]<qr[l2]?ql[l1++]+:qr[l2++]+;
}
ans=max(ans,i-tmp+);
}
printf("%d",ans);
return ;
}
(noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列的更多相关文章
- bzoj2500幸福的道路 树形dp+单调队列
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 434 Solved: 170[Submit][Status][Discuss ...
- 【bzoj2500】幸福的道路 树形dp+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案
考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...
- 【BZOJ2500】幸福的道路 树形DP+RMQ+双指针法
[BZOJ2500]幸福的道路 Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的 ...
- 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分
原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...
- bzoj2500: 幸福的道路(树形dp+单调队列)
好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...
- 【NOIP模拟&POJ2152】灰色的果实(树形DP)
题意: Nebula 历 2014 年 12 月 17 日,欢迎来到异世界. 面对截然不同的新世界,你决定采取最普通但最为有效的方式来探索,那便 是徒步.准备好营地的一切,你开始了探索的旅程. 步行大 ...
- 重建道路 树形DP
重建道路 树形DP 给一棵树,问最少断多少边使得这棵树树最终只有\(p\)个节点 设计dp状态\(f[u][i][j]\)表示节点\(u\),到第\(i\)个儿子,使\(j\)个节点分离,但是不分离 ...
- [Bzoj2500]幸福的道路(树上最远点)
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 474 Solved: 194[Submit][Status][Discuss ...
随机推荐
- APUE学习笔记5——信号、信号集和进程信号屏蔽字
1 信号传递过程 当引发信号的事件发生时(如软硬件异常.软件定时.终端产生信号或调用kill函数等等),会产生信号,内核会发送给目标进程. 在信号产生到信号传递给目标进程之间的时间间隔内,称该信号为未 ...
- VS运行程序发生栈溢出的分析
这两天时间都浪费在解决各种栈溢出了,没想到最后各个部件合在一起的时候会出现这么多的问题,这其实是我第一次解决栈溢出问题,很认真的查了查资料,找了几种解决方法,但是作用都不大,拆了东墙补西墙,虽然知道及 ...
- ZBrush中2.5D笔刷
ZBrush®是一个数字雕刻和3维建模软件,它不仅有着强大的3D雕刻功能,对于2.5D笔刷的应用也毫不逊色.本文主要讲解2.5D笔刷的一些使用方法,2.5D笔刷是针对贴图绘画的增效画笔工具和其他一些工 ...
- 备份和恢复ZBrush文件
ZBrush可以自动保存绘图的备份副本,并在发生系统错误时提醒您恢复备份副本.当ZBrush软件遇到崩溃.导致错误.非正常退出的时候,可能之前所做的努力就会功亏一篑,那么,在ZBrush软件中能否将文 ...
- Codeforces Round #493 (Div. 1) B. Roman Digits 打表找规律
题意: 我们在研究罗马数字.罗马数字只有4个字符,I,V,X,L分别代表1,5,10,100.一个罗马数字的值为该数字包含的字符代表数字的和,而与字符的顺序无关.例如XXXV=35,IXI=12. 现 ...
- kafka内外网集群配置
linux下配置使用以第一台为例(先配置好jdk环境)1.解压kafka:2.10-0.10.1.12.修改zookeeper.properties 新增配置:maxClientCnxns=0 tic ...
- [luogu2501 HAOI2006] 数字序列 (递推LIS)
题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. 输入输出格式 输入格式: 第一行包含一个数 ...
- python中try…except的使用,处理程序异常
通常情况下,在python中运行程序,多多少少会出现程序异常的问题,try……except能很好的解决程序中的异常.以下是其用法,在不同位置时进行什么样的工作和起到什么样的作用. try: 可能出现异 ...
- NOIP2018提高组金牌训练营——字符串专题
NOIP2018提高组金牌训练营——字符串专题 1154 回文串划分 有一个字符串S,求S最少可以被划分为多少个回文串. 例如:abbaabaa,有多种划分方式. a|bb|aabaa - 3 个 ...
- centos7下搭建solr服务器
1.Solr的环境 Solr是java开发. 需要安装jdk. 安装环境Linux. 需要安装Tomcat. 1.2. 搭建步骤 第一步:把solr 的压缩包上传到Linux系统 第二步:解压solr ...