好题~~

给你n个数和k,求有多少的区间使得区间内部任意两个数的差值小于k,输出符合要求的区间个数,枚举后界~~

又是一种没见过的方法,太弱了/(ㄒoㄒ)/~~

  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <iostream>
  6. #include <queue>
  7. #include <algorithm>
  8. #include <vector>
  9. #include <set>
  10. using namespace std;
  11. #define LL __int64
  12. #define INF 0x3f3f3f3f
  13. const int MAXN=;
  14. #define mod 1000000007
  15.  
  16. int a[MAXN];
  17. LL ans;
  18. int dp1[MAXN][],dp2[MAXN][];
  19.  
  20. void init(int n)
  21. {
  22. for(int i=;i<=n;i++)
  23. dp1[i][]=dp2[i][]=a[i];
  24. for(int j=;(<<j)<=n;j++)
  25. {
  26. for(int i=;i+(<<j)-<=n;i++)
  27. {
  28. dp1[i][j]=max(dp1[i][j-],dp1[i+(<<(j-))][j-]);
  29. dp2[i][j]=min(dp2[i][j-],dp2[i+(<<(j-))][j-]);
  30. }
  31. }
  32. }
  33.  
  34. int RMQ(int L,int R)
  35. {
  36. int k=;
  37. while((<<(k+))<=R-L+)k++;
  38. return max(dp1[L][k],dp1[R-(<<k)+][k])-min(dp2[L][k],dp2[R-(<<k)+][k]);
  39. }
  40.  
  41. int binarySearch(int L,int R,int n,int k)
  42. {
  43. int mid;
  44. int l=L,r=R;
  45. while(l<=r)
  46. {
  47. mid=(l+r)/;
  48. if(RMQ(mid,R)>=k)
  49. {
  50. l=mid+;
  51. }
  52. else
  53. {
  54. r=mid-;
  55. }
  56. }
  57. if(RMQ(mid,R)>=k)
  58. mid++;
  59. return mid;
  60. }
  61. int main()
  62. {
  63. int T,i,j,n,k,mi,ma,l,r;
  64. while(~scanf("%d",&T))
  65. {
  66. while(T--)
  67. {
  68. scanf("%d%d",&n,&k);
  69. for(i=;i<=n;i++)
  70. scanf("%d",&a[i]);
  71. if(!k)
  72. {
  73. printf("0\n");
  74. continue;
  75. }
  76. if(k==)
  77. {
  78. printf("%d\n",n);
  79. continue;
  80. }
  81. init(n);
  82. ans=;
  83. for(i=j=;i<=n;i++)
  84. {
  85. j=binarySearch(j,i,n,k);
  86. ans+=i-j+;
  87. }
  88. printf("%I64d\n",ans);
  89. }
  90. }
  91. return ;
  92. }
  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. #include <algorithm>
  5. using namespace std ;
  6. #define LL __int64
  7. deque <LL> deq1 , deq2 ;
  8. //单调队列,deq1最大值,deq2最小值
  9. LL a[] ;
  10. int main() {
  11. int t , n , i , j ;
  12. LL k , ans ;
  13. #ifndef ONLINE_JUDGE
  14. freopen("1.in","r",stdin);
  15. #endif
  16. scanf("%d", &t) ;
  17. while( t-- ) {
  18. scanf("%d %I64d", &n, &k) ;
  19. for(i = ; i < n ; i++)
  20. scanf("%I64d", &a[i]) ;
  21. if(k == ) {
  22. printf("0\n") ;
  23. continue ;
  24. }
  25. while( !deq1.empty() ) deq1.pop_back() ;
  26. while( !deq2.empty() ) deq2.pop_back() ;
  27. for(i = , j = , ans = ; i < n ; i++) {//i在前,j在后
  28. while( !deq1.empty() && deq1.back() < a[i] ) deq1.pop_back() ;
  29. deq1.push_back(a[i]) ;
  30. while( !deq2.empty() && deq2.back() > a[i] ) deq2.pop_back() ;
  31. deq2.push_back(a[i]) ;
  32. while( !deq1.empty() && !deq2.empty() && deq1.front() - deq2.front() >= k ) {
  33. ans += (i-j) ;
  34. //printf("%d %d,%I64d %I64d\n", i , j, deq1.front() , deq2.front() ) ;
  35. if( deq1.front() == a[j] ) deq1.pop_front() ;
  36. if( deq2.front() == a[j] ) deq2.pop_front() ;
  37. j++ ;
  38. }
  39. }
  40. while( j < n ) {
  41. ans += (i-j) ;
  42. j++ ;
  43. }
  44. printf("%I64d\n", ans) ;
  45. }
  46. return ;
  47. }

hdu 5289 rmp+二分+枚举后界 or单调队列 ****的更多相关文章

  1. 【BZOJ2806】Cheat(后缀自动机,二分答案,动态规划,单调队列)

    [BZOJ2806]Cheat(后缀自动机,二分答案,动态规划,单调队列) 题面 BZOJ 洛谷 题解 很有趣的一道题啊 对于在所有的串上面进行匹配? 很明显的后缀自动机 所以先构建出广义后缀自动机 ...

  2. HDU 5289 Assignment(多校2015 RMQ 单调(双端)队列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289 Problem Description Tom owns a company and he is ...

  3. bzoj 1171 并查集优化顺序枚举 | 线段树套单调队列

    详见vfleaking在discuss里的题解. 收获: 当我们要顺序枚举一个序列,并且跳过某些元素,那么我们可以用并查集将要跳过的元素合并到一起,这样当一长串元素需要跳过时,可以O(1)跳过. 暴力 ...

  4. hdu 6444 网络赛 Neko's loop(单调队列 + 裴蜀定理)题解

    题意:有编号为0~n-1的n个游戏,每个活动都有一个价值(可为负),给你m,s和k,你可以从任意一个编号开始玩,但是下一个游戏必须是编号为(i + k)%n的游戏,你最多能玩m次游戏,问你如果最后你手 ...

  5. 无题II hdu 2236(二分枚举区间)

    分析:只需要用二分找一个区间,然后不断枚举这个区间是否可以达到最大匹配,一直二分到答案为止.   代码: =============================================== ...

  6. hdu 3189(网络流+二分枚举)

    Steady Cow Assignment Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6422   Accepted: ...

  7. HDU 4123 Bob’s Race 树的直径+单调队列

    题意: 给定n个点的带边权树Q个询问. 以下n-1行给出树 以下Q行每行一个数字表示询问. 首先求出dp[N] :dp[i]表示i点距离树上最远点的距离 询问u, 表示求出 dp 数组中最长的连续序列 ...

  8. HDU 5380 Travel with candy (贪心,单调队列)

    题意: 有n+1个城市按顺序分布在同一直线上,现在需从0号城市按顺序走到n号城市(保证可达),从0号城市到i号城市需要消耗ai个糖果,每个城市都可以通过买/卖糖果来赚取更多的钱,价格分别是buyi和s ...

  9. 【单调队列+尺取】HDU 3530 Subsequence

    acm.hdu.edu.cn/showproblem.php?pid=3530 [题意] 给定一个长度为n的序列,问这个序列满足最大值和最小值的差在[m,k]的范围内的最长子区间是多长? [思路] 对 ...

随机推荐

  1. C#中委托演变的的三个阶段

    命名函数 匿名方法 lambda表达式 委托是一种可以把引用存储为函数的类型,定义了委托后,就可以声明该委托类型的变量,接着把这个变量初始化为与委托有相同返回类型和参数列表的函数引用,之后就可以使用委 ...

  2. STL---总结

    文章转自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/22/2603525.html 一.STL的六大组件 容器(Container),是一种 ...

  3. wxPython+Boa Constructor环境配置

    配置之前先完成eclipse + Pydev的配置环境.详见http://www.cnblogs.com/dflower/archive/2010/05/13/1734522.html 1. 安装 w ...

  4. FastReport里面正确调用函数的方法

    FastReport里面正确调用函数的方法   错误:  [FormatDateTime('yyyy-mm-dd',[frxDBDataset1."日期"])] --------- ...

  5. monitor disk

    #!/bin/bash # #top #Big_USERS - find big disk space users in various directories ################### ...

  6. Mathematics:Ultra-QuickSort(POJ 2299)

    极度快速排序 题目大意:在一个输入数组中找逆序数... 水题,求逆序数的很好的算法,就是MergeSort,和我之前发的DNA那个差不多,最后就是后台数据很大,答案要用long long #inclu ...

  7. VC++ 之常见内存异常值

    0 VC++ 常见的内存异常值 * 0xcccccccc : Used by Microsoft's C++ Debugging runtime library to mark uninitialis ...

  8. linux权限不够,sh不能用

    linux下权限不够 chmod +x 脚本命令 ./脚本命令  即可... sh startup.sh启动tomcat,出现 This file is needed to run this prog ...

  9. ExpandableListView的用法

    ExpandableListView组件是android中一个比较常用的组件,当点击一个父item的时候可以将它的子item显示出来,像手机QQ中的好友列表就是实现的类型效果.使用Expandable ...

  10. asp.net 防止按钮重复提交

    1.将按钮属性设置如下: <asp:Button ID="btConfirm" runat="server" Text="Confirm&quo ...