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就可以作为观测区间,问这 ...
随机推荐
- Reprint: ADB is Not Recognized as an internal or external command Fix
ADB: Android Debug Bridge http://zacktutorials.blogspot.hk/2013/04/adb-is-not-recognized-as-internal ...
- Silicon C8051F340之时钟系统
一.背景 做个记录,以备下次快速开发. 二.正文 C8051F340有一个可编程内部高频振荡器.一个可编程内部低频振荡器.一个外部振荡器驱动电路 和一个4倍时钟乘法器.其中可编程内部高频振荡器在系统复 ...
- PHP定时备份MySQL,mysqldump语法大全
几个常用操作: 1.备份 # 只导出表结构 d:/PHP/xampp/mysql/bin/mysqldump -h127.0.0.1 -P3306 -uroot -p123456 snsgou_sns ...
- Mac Pro 实现 PHP-5.6 与 PHP-7.0 等多版本切换
先前参考 如何 实现PHP多版本的 共存 和 切换? 实现了Linux(Ubuntu/CentOS)系统下,PHP多版本的切换,但是在 Mac OS 下,由于用户权限控制的比较严格,文章里提到的脚本运 ...
- python之路十
协程协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程.协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时 ...
- spring mvc redis消息队列
通常情况下,为了提高系统开发的灵活性和可维护度,我们会采用消息队列队系统进行解耦.下面是一个采用spring redis实现的消息队列实例,但此实例会由于网络延迟和阻塞等情况导致消息处理的延时,因而不 ...
- 去哪儿网输入框三种输入方式(selenium webdriver 干货)
在机票预定的页面,输入出发城市和到达城市输入框的时候, 发现直接使用sendkeys不好使, 大部分情况出现输入某城市后没有输入进去, 经过几天的研究,发现可以采取三种方式: 1. 先点击输入框,待弹 ...
- 整合SSM时报错:java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer;
在整合Spring和MyBatis时,只进行了简单的插入操作,结果报了这个错,顿时整个人都崩溃了 -- 一点都看不懂嘛!只有网上搜索 结果是在使用MyBatis3.x和Spring4.x整合是 导入的 ...
- push 到下一界面明显卡顿的现象
今天搭建界面,界面间的跳转使用了 push方法,结果发现界面间转换时有明显的卡顿现象,并没有做过数据请求之类的处理,所以感觉好神奇.以前好像也遇到过,当时在push 到的下级界面加个背景色.现在重新这 ...
- 获取到Android控件的高度
问题 如何获取一个控件的长和高,相信很多朋友第一眼看见这个问题都会觉得很简单,直接在onCreate里面调用getWidth.getMeasuredWidth不就可以获得了吗,但是,事实上是并没有简单 ...