树形DP+单调队列优化DP


  好题(也是神题……玛雅我实在是太弱了TAT,真是一个250)

  完全是抄的zyf的……orz我还是退OI保平安吧

  第一步对于每一天求出一个从第 i 个点出发走出去的最长链的长度,树形DP解决……

    g[x][0]表示从x的子树中,x到叶子的最长链,g[x][1]表示次长链。(用儿子更新父亲)

    f[x]表示从x向上走到某个父亲,再向下的最长链。(用父亲更新儿子)

  这个DP是通过两次从根出发的dfs实现的。

  那么我们现在就得到了a[i]=max(f[i],g[i][0])表示从 i 出发的最长链的长度。

  第二步是要在a数组中求一段最长的区间满足极差小于等于m。

  这个居然可以单调队列QAQ(当然啦……右端点为1~n时,左端点也是单调向右移动的!

  用两个队列分别维护最大值和最小值,将当前结点入队后,如果最大值-最小值(两个队列的队头)>m,则选一个较小的队头,以 i 为右节点的最长区间 的左端点,就是较小的队头表示的位置+1,(扔掉那个最小的以后剩下的就合法了啊)(才怪!如果不合法,继续扔,边扔边更新答案)

  sigh……DP真是一种神奇的算法……我还是too young too naive

  UPD:2015-04-24 11:14:03

  其实第二步我以前做过的QAQ,早忘了而已……

  戳这里:【HDOJ】【3530】Subsequence

  1. /**************************************************************
  2. Problem: 2500
  3. User: Tunix
  4. Language: C++
  5. Result: Accepted
  6. Time:2496 ms
  7. Memory:55960 kb
  8. ****************************************************************/
  9.  
  10. //Huce #1 C
  11. #include<vector>
  12. #include<cstdio>
  13. #include<cstring>
  14. #include<cstdlib>
  15. #include<iostream>
  16. #include<algorithm>
  17. #define rep(i,n) for(int i=0;i<n;++i)
  18. #define F(i,j,n) for(int i=j;i<=n;++i)
  19. #define D(i,j,n) for(int i=j;i>=n;--i)
  20. #define pb push_back
  21. using namespace std;
  22. inline int getint(){
  23. int v=,sign=; char ch=getchar();
  24. while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
  25. while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
  26. return v*sign;
  27. }
  28. const int N=1e6+,INF=~0u>>;
  29. typedef long long LL;
  30. /******************tamplate*********************/
  31. int to[N],next[N],head[N],len[N],cnt;
  32. void add(int x,int y,int z){
  33. to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt; len[cnt]=z;
  34. }
  35. int n,m;
  36. LL f[N],g[N][],a[N];
  37. void down(int x){
  38. for(int i=head[x];i;i=next[i]){
  39. down(to[i]);
  40. if (g[to[i]][]+len[i]>g[x][]){
  41. g[x][]=g[x][];
  42. g[x][]=g[to[i]][]+len[i];
  43. }else g[x][]=max(g[x][],g[to[i]][]+len[i]);
  44. }
  45. }
  46. void up(int x){
  47. int y;
  48. for(int i=head[x];i;i=next[i]){
  49. f[y=to[i]]=f[x]+len[i];
  50. if (g[y][]+len[i]==g[x][]) f[y]=max(f[y],g[x][]+len[i]);
  51. else f[y]=max(f[y],g[x][]+len[i]);
  52. up(y);
  53. }
  54. }
  55. int Q1[N],Q2[N];
  56. int main(){
  57. #ifndef ONLINE_JUDGE
  58. freopen("C.in","r",stdin);
  59. freopen("C.out","w",stdout);
  60. #endif
  61. n=getint(); m=getint();
  62. int x,y,z;
  63. F(i,,n){
  64. x=getint(); z=getint();
  65. add(x,i,z);
  66. }
  67. down(); up();
  68. F(i,,n) a[i]=max(f[i],g[i][]);
  69. LL ret=,ans=;int l1=,r1=-,l2=,r2=-;
  70. F(i,,n){
  71. while(l1<=r1 && a[i]<=a[Q1[r1]]) r1--;
  72. Q1[++r1]=i;
  73. while(l2<=r2 && a[i]>=a[Q2[r2]]) r2--;
  74. Q2[++r2]=i;
  75. while(a[Q2[l2]]-a[Q1[l1]]>m)
  76. ret=Q1[l1]<Q2[l2] ? Q1[l1++]+ : Q2[l2++]+;
  77. ans=max(ans,i-ret+);
  78. }
  79. printf("%lld\n",ans);
  80. return ;
  81. }

2500: 幸福的道路

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 153  Solved: 60
[Submit][Status][Discuss]

Description

小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光.
他们画出了晨练路线的草图,眼尖的小T发现可以用树来描绘这个草图.
他们不愿枯燥的每天从同一个地方开始他们的锻炼,所以他们准备给起点标号后
顺序地从每个起点开始(第一天从起点一开始,第二天从起点二开始……).
而且他们给每条道路定上一个幸福的值.很显然他们每次出发都想走幸福值和最长的路线(即从起点到树上的某一点路径中最长的一条).
他们不愿再经历之前的大起大落,所以决定连续几天的幸福值波动不能超过M(即一段连续的区间并且区间的最大值最小值之差不超过M).他们想知道要是这样的话他们最多能连续锻炼多少天(hint:不一定从第一天一直开始连续锻炼)?
现在,他们把这个艰巨的任务交给你了!

Input

第一行包含两个整数N, M(M<=10^9).
第二至第N行,每行两个数字Fi , Di, 第i行表示第i个节点的父亲是Fi,且道路的幸福值是Di.

Output

最长的连续锻炼天数

Sample Input

3 2
1 1
1 3

Sample Output

3
数据范围:
50%的数据N<=1000
80%的数据N<=100 000
100%的数据N<=1000 000

HINT

Source

[Submit][Status][Discuss]

【BZOJ】【2500】幸福的道路的更多相关文章

  1. [BZOJ 2500] 幸福的道路

    照例先贴题面(汪汪汪) 2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 368  Solved: 145[Submit][Sta ...

  2. [BZOJ 2500]幸福的道路 树形dp+单调队列+二分答案

    考试的时候打了个树链剖分,而且还审错题了,以为是每天找所有点的最长路,原来是每天起点的树上最长路径再搞事情.. 先用dfs处理出来每个节点以他为根的子树的最长链和次长链.(后面会用到) 然后用类似dp ...

  3. ●BZOJ 2500 幸福的道路

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2500 题解: DFS,单调队列 首先有一个结论,距离树上某一个点最远的点一定是树的直径的一个 ...

  4. bzoj 2500 幸福的道路 树上直径+set

    首先明确:树上任意一点的最长路径一定是直径的某一端点. 所以先找出直径,求出最长路径,然后再求波动值<=m的最长区间 #include<cstdio> #include<cst ...

  5. BZOJ 2500 幸福的道路(race) 树上直径+平衡树

    structHeal { priority_queue<int> real; priority_queue<int> stack; void push(int x){ real ...

  6. BZOJ2500: 幸福的道路

    题解: 一道不错的题目. 树DP可以求出从每个点出发的最长链,复杂度O(n) 然后就变成找一个数列里最长的连续区间使得最大值-最小值<=m了. 成了这题:http://www.cnblogs.c ...

  7. bzoj2500幸福的道路 树形dp+单调队列

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 434  Solved: 170[Submit][Status][Discuss ...

  8. [Bzoj2500]幸福的道路(树上最远点)

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 474  Solved: 194[Submit][Status][Discuss ...

  9. 【BZOJ2500】幸福的道路 树形DP+RMQ+双指针法

    [BZOJ2500]幸福的道路 Description 小T与小L终于决定走在一起,他们不想浪费在一起的每一分每一秒,所以他们决定每天早上一同晨练来享受在一起的时光. 他们画出了晨练路线的草图,眼尖的 ...

随机推荐

  1. webform网站相关数据控件和其他

    一.asp:Repeater <div class="bd"> <ul> <asp:Repeater ID="rept_slide" ...

  2. C#关于一个程序,只可以有一种实例的方法

    方法一:使用线程互斥变量. 通过定义互斥变量来判断是否已运行实例.把program.cs文件里的Main()函数改为如下代码: 说明:程序中通过语句 System.Threading.Mutex ru ...

  3. Setup Factory 程序打包

    1.检测是否已安装 在On Startup中写入如下代码: result1=Registry.DoesKeyExist(HKEY_LOCAL_MACHINE, "Software\\sohe ...

  4. nginx学习笔记1

    Nginx是使用c语言编写的,查看nginx编译时参数的设定  使用nginx -V命令查看 可以使用nginx -h命令查看命令帮助 配置文件中将worker process绑定到cpu的特定内核上 ...

  5. iphone/ipad关于size, frame and bounds总结和UIScroll view学习笔记

    1. iphone/ipad大小 Device Screen dimensions(in points) iphone and ipod 320 X 480 ipad 768 X 1024 2. UI ...

  6. C 的 一些写法格式 交流

    好久以前刚开始学习前辈们的代码的时候,发现好多代码感到好奇怪. 1)代码看不懂 2)代码格式看不懂 网上也没见同学们分享.当自己代码写多了,也渐渐的理解为什么要这样写了. 说主题之前 还是 说一些 题 ...

  7. 算法:C++排列组合

    题目:给定1-n数字,排列组合. 解法:递归.第一个数字有n种选择,第二个数字有n-1种选择,依次递归排列输出.用数组表示n个数字,用过的数字置0. 实现语言:C++ #include <ios ...

  8. EXCLE中快速插入图片

    在excle中怎么快速插入图片呢,一张一张点实在比较麻烦 解决办法: <table><img src="D:\A.png" width="60" ...

  9. eclipse java.lang.OutOfMemoryError: Java heap space

    1.手动编译运行需要添加 java -Xms256m -Xmx1024m classname 2.在eclipse中,在run as -> run configurations -> ar ...

  10. hdu 1874 畅通工程续

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1874 畅通工程续 Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过 ...