bzoj2500: 幸福的道路(树形dp+单调队列)
好题。。
先找出每个节点的树上最长路
由树形DP完成
节点x,设其最长路的子节点为y
对于y的最长路,有向上和向下两种情况:
down:y向子节点的最长路g[y][0]
up:x的次长路的g[x][1]+dis[x][y]
up:up[fa[x]]+dis[x][y]
dfs1找向下,即向子节点的最长路
dfs2找向上的最长路
最后最长路f[i]=max(up[x],g[x][0])
第二部分
找最长连续子序列,使得序列中abs(mx-mn)<=m
这次学习了用单调队列的做法
两个队列mx,mn
mx存单减的f[i]的i,mn单增
由于差值不大于m
每次找出front的最小值出队就行了
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
#define LL long long
using namespace std;
;
struct node{
int to,next;
LL cost;
}e[maxn];
int n,m,tot,x;
LL g[maxn][],f[maxn],y,head[maxn];
void insert(int u, int v, LL c){
e[++tot].to=v; e[tot].next=head[u]; head[u]=tot; e[tot].cost=c;
}
#define v e[i].to
void dfs1(int u){
; i=e[i].next){
dfs1(v);
]<g[v][]+e[i].cost){
g[u][]=max(g[u][],g[u][]);
g[u][]=g[v][]+e[i].cost;
}]=max(g[u][],g[v][]+e[i].cost);
}
}
void dfs2(int u){
; i=e[i].next){
f[v]=f[u]+e[i].cost;
]+e[i].cost==g[u][]) f[v]=max(f[v],g[u][]+e[i].cost);
]+e[i].cost);
dfs2(v);
}
}
int main(){
scanf("%d%d", &n, &m);
tot=; memset(head,-,sizeof(head));
; i<=n; i++){
int x; LL y;
scanf("%d%lld", &x, &y);
insert(x,i,y);
}
dfs1();
dfs2();
; i<=n; i++) f[i]=max(f[i],g[i][]);
deque<int> mx,mn;
;
;
; i<=n; i++){
while (!mx.empty() && f[mx.back()]<=f[i]) mx.pop_back();
while (!mn.empty() && f[mn.back()]>=f[i]) mn.pop_back();
mx.push_back(i); mn.push_back(i);
while (f[mx.front()]-f[mn.front()]>m){
if (mx.front()<mn.front()){
st=mx.front()+;
mx.pop_front();
}
else{
st=mn.front()+;
mn.pop_front();
}
}
ans=max(ans,i-st+);
}
printf("%d\n", ans);
;
}
bzoj2500: 幸福的道路(树形dp+单调队列)的更多相关文章
- bzoj2500幸福的道路 树形dp+单调队列
2500: 幸福的道路 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 434 Solved: 170[Submit][Status][Discuss ...
- (noip模拟二十一)【BZOJ2500】幸福的道路-树形DP+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- 【bzoj2500】幸福的道路 树形dp+单调队列
Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图. ...
- [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案
考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...
- 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分
原文地址:http://www.cnblogs.com/GXZlegend/p/6825389.html 题目描述 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一 ...
- 【BZOJ2500】幸福的道路 树形DP+RMQ+双指针法
[BZOJ2500]幸福的道路 Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的 ...
- Codeforces 980F Cactus to Tree 仙人掌 Tarjan 树形dp 单调队列
原文链接https://www.cnblogs.com/zhouzhendong/p/CF980F.html 题目传送门 - CF980F 题意 给定一个 $n$ 个节点 $m$ 条长为 $1$ 的边 ...
- HDU 4123 Bob’s Race 树形dp+单调队列
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 Time Limit: 5000/2000 MS (Java/Others) Memory L ...
- POJ - 3162 Walking Race 树形dp 单调队列
POJ - 3162Walking Race 题目大意:有n个训练点,第i天就选择第i个训练点为起点跑到最远距离的点,然后连续的几天里如果最远距离的最大值和最小值的差距不超过m就可以作为观测区间,问这 ...
随机推荐
- 【bzoj1076】[SCOI2008]奖励关
题目描述 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出k次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝物之前做出选择,且现在决定不吃的宝物以后也不能再 ...
- 【bzoj4326】[NOIP2015]运输计划
题目描述 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P 掌管一家物流公司, 该 ...
- jQuery如何判断元素是否是隐藏的?
jQuery函数简介: is(expr) 用一个表达式来检查当前选择的元素集合,如果其中至少有一个元素符合这个给定的表达式就返回true. 如果没有元素符合,或者表达式无效,都返回'false'. 注 ...
- 【MySQL】使用Length和Cast函数计算TEXT类型字段的长度
背景: 前段时间,业务需要,为了快速让解析的Excel入库,所以把不是很确定的字段全部设置成了TEXT. 今天需要进行表结构优化,把字段长度控制在合适的范围,并尽量不使用TEXT类型. -- 计算长度 ...
- 【转】AWK 简明教程
本文转自:http://coolshell.cn/articles/9070.html 有一些网友看了前两天的<Linux下应该知道的技巧>希望我能教教他们用awk和sed,所以,出现了这 ...
- CCProxy二级代理上网设置
假如电脑A可以通过代理服务器上网,B电脑又可以连接A电脑,那么A电脑可以作为二级代理服务器进行上网,需要设置如下: 1.在A电脑上安装CCProxy,以v8.0为例 2.选择设置->高级 3.启 ...
- yii框架中验证器声明一组内置验证器可以使用短名称引用
1.内置验证器的短名称分别有: boolean: yii\validators\BooleanValidator captcha: yii\captcha\CaptchaValidator compa ...
- 导入excel数据到数据库
1.上传excel到服务器 jsp页面代码 <form action="actionname" method="post" id="form1& ...
- seajs和requirejs
一.seajs 1. 使用seajs的一般步骤 a)在主页面引入sea.js b)写模块 c)在主页面使用模块 2.模块的写法 math.js define(function(require, exp ...
- APP测试实用小工具
1.ADB万能驱动 http://pan.baidu.com/s/1jIJPwhS 2.安卓手机屏幕共享 http://pan.baidu.com/s/1nv6ma1b 3.IOS手机屏幕共享 htt ...