好题~~

给你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. zend studio安装svn插件

    进入zend->Help->Install New Software 输入如下地址: http://subclipse.tigris.org/update_1.8.x 选择subclips ...

  2. php preg_match($p, $str, $match)方法简介

    方法作用:匹配指定的正则表达式并将结果放在$match数组中 代码示例: $p = '/name:([\\ws]+)/'; $str = "name:steven jobs"; p ...

  3. Python操作excel,及图表展示

    学习:http://www.cnblogs.com/Lands-ljk/p/5444619.html

  4. 【GoLang】golang runtime 调度原理

    参考资料: http://m.yl1001.com/group_article/3231471449287668.htm http://tieba.baidu.com/p/3542454435?sha ...

  5. java切换VPN让你像幽灵一样出现在全国各地

    在很多情况下,有些网络应用的需求会要求模拟人在不同地区访问网站和应用.因而切换IP也就应运而生了,然而IP作为一种稀缺资源不是随便可以获得的.因而会想到应用程序切换VPN来达到全国不同地区访问网络.因 ...

  6. Android SDK打包

    2015年6月18日 14:38:49 星期四 eclipse: 1. 将写好的代码上传版本库 2. 删除 /bin/* 3. eclipse->project->clean... 4. ...

  7. perl 从文件里读出变量无法使用解决办法

    最近在写一个perl函数,把test case 放到配置文件里,读出来然后使用system运行. 我的本意是: 配置文件conf ping -c $count $ip #在主程序中定义$ip和$cou ...

  8. VS2013,asp.net网站转换为web应用程序

    此功能已经不在右键菜单里了,而在主菜单中的“项目-->转换为WEB应用程序”

  9. Oracle 修改现有列的数据类型

    如果表中有数据,Oracle是不能修改其数据类型的.但可以通过新建一个临时列,将要修改列的数据复制到临时列中,删除原列再修改临时列的名字.这样说好像有点拗口,分步解说一下. 表AC_REG中有列:is ...

  10. Luncence .Net 使用

    public partial class Form1 : Form { public Form1() { InitializeComponent(); } //标准分词 private void bu ...