题意:给T足数据,然后每组一个n和k,表示n个数,k表示最大同意的能力差,接下来n个数表示n个人的能力,求能力差在k之内的区间有几个


分析:维护一个区间的最大值和最小值,使得他们的差小于k,于是採用单调队列


普通单调队列做法:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1e6+5;
int a[maxn];
struct node{int index;int v;
}qd[maxn];
node qx[maxn];
int main()
{int t;scanf("%d",&t);while(t--){int n,k;scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}int st1,st2,ed1,ed2;st1=st2=ed1=ed2=1;long long sum=0;int j=1;for(int i=1;i<=n&&j<=n;i++){        if(i==1){qd[1].index=qx[1].index=1;qd[1].v=qx[1].v=a[1];}else{while(st1<=ed1){                //单调队列维护最大值if(qd[ed1].v<=a[i]) ed1--;  //比a[i]小的并且下标比i小的出队列else break;}qd[++ed1].v=a[i];               //a[i]入队列qd[ed1].index=i;while(st2<=ed2){                //单调队列维护最小值if(qx[ed2].v>=a[i]) ed2--;  //比a[i]大并且下标比i小的出队列else break;}qx[++ed2].v=a[i];               //a[i]入队列qx[ed2].index=i;while(qd[st1].v-qx[st2].v>=k&&st1<=ed1&&st2<=ed2)   //计数{if(qd[st1].index==j) st1++;if(qx[st2].index==j) st2++;sum+=(i-j);j++;}}}while(j<=n) {sum+=(n-j+1);j++;}printf("%I64d\n",sum);}
}

二分单调队列做法:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 1e6+5;
int a[maxn];
struct node{int index;int v;
}qd[maxn];
node qx[maxn];
int maxc(int l,int r,int d){        //二分找出d入队列的为止while(l<=r){int mid=(l+r)/2;if(qd[mid].v==d) return mid;else if(qd[mid].v>d) l=mid+1;else r=mid-1;}return l;
}
int minc(int l,int r,int d){        //二分找出d入队列的为止while(l<=r){int mid=(l+r)/2;if(qx[mid].v==d) return mid;else if(qx[mid].v<d) l=mid+1;else r=mid-1;}return l;
}
int main()
{int t;scanf("%d",&t);while(t--){int n,k;scanf("%d%d",&n,&k);for(int i=1;i<=n;i++){scanf("%d",&a[i]);}int st1,st2,ed1,ed2;st1=st2=ed1=ed2=1;long long sum=0;int j=1;for(int i=1;i<=n&&j<=n;i++){if(i==1){qd[1].index=1;qd[1].v=a[1];qx[1].index=1;qx[1].v=a[1];}else{ed1=maxc(st1,ed1,a[i]); //二分找出d入队列的为止,维护最大值qd[ed1].v=a[i];         qd[ed1].index=i;ed2=minc(st2,ed2,a[i]); //二分找出d入队列的为止,维护最小值qx[ed2].v=a[i];qx[ed2].index=i;while(qd[st1].v-qx[st2].v>=k&&st1<=ed1&&st2<=ed2)//计数{if(qd[st1].index==j) st1++;if(qx[st2].index==j) st2++;sum+=(i-j);j++;}}}while(j<=n) {sum+=(n-j+1);j++;}printf("%I64d\n",sum);}
}


HDU 5289 Assignment(单调队列)相关推荐

  1. hdu 3401 Trade(单调队列优化dp)

    hdu 3401 Trade(单调队列优化dp) 题意:lxhgww喜欢炒股票,他可以在第i天买入或者卖出若干张股票(一天只能买或者卖),两个交易日之间至少相隔w天,问他t天后最多能赚多少. 解题思路 ...

  2. HDU - 3530 Subsequence(单调队列+思维)

    题目链接:点击查看 题目大意:给出一段长度为n的序列,现在给出一个m和一个k,必须满足一段连续区间内的最大值与最小值的差值大于等于m并且小于等于k,问满足条件的连续区间的最大长度 题目分析:一开始看到 ...

  3. HDU 6319(单调队列)

    传送门 题面: Problem A. Ascending Rating Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 524288/ ...

  4. hdu 3530 Subsequence 单调队列

    寻找一个区间,满足:其中的最大值减最小值在[m,k]的范围内,输出最大的区间长度. 思路:维护2个单调队列,一个递增,一个递减. 用一个now记录现在的区间的起点,如果大的数-小的数比k还大,则可以丢 ...

  5. Fxx and game HDU - 5945(单调队列优化dp)

    思路:考虑反着dp,从dp[1]倒推dp[x] 因为dp[i]<=dp[j]  j<i  ,所以考虑用单调队列来优化. 除法不用考虑,考虑加法就行. 代码: #include <bi ...

  6. 入门经典_Chap08_题解总结:极角扫描法 滑动窗口 单调队列 单调栈

    总结  本章主要关注一个重要的问题 – 单调队列和单调栈的使用  同时还有一些其他的问题,如扫描法,递归的思想, 构造, 分治, 二分等 知识点 单调队列 和 单调栈 题目 UVA - 1606 Am ...

  7. hdu 3706 Second My Problem First 单调队列

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3706 Second My Problem First Time Limit: 12000/4000 M ...

  8. HDU 6194 string string string :后缀数组+单调队列 | 后缀自动机

    题意:给出一个字符串,求出出现了恰好k次的子串的个数. 题解:恰好k次 = 至少k次 - 至少k+1次.答案转化为求至少出现k次的子串个数统计.构造好后缀数组以及很重要的Height数组之后.用一个k ...

  9. Hdu 2430 Beans (数据结构_单调队列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2430 题目大意:有n坨豌豆,每坨都有w[i]个,现在要从中选择连续的若干坨,然后用一个能装p个豌豆的背 ...

最新文章

  1. 对于非阻塞socket的可写事件
  2. Android学习——ListView的缓存机制
  3. 树莓派Raspbian Buster/Debian 10 安装ROS
  4. 图解算法学习笔记(六):广度优先搜索
  5. 什么是嵌入式工程师,发展前景如何
  6. Android6.0以上打电话动态权限
  7. mysql 数据库的 导入于导出
  8. php asp网站本地调试,php/asp网站程序本地调试工具
  9. Java递归算法实例
  10. Windows电脑怎么卸载服务/删除服务?
  11. 1. Cloudcraft
  12. 制作QQ微信支付宝三合一收款码
  13. 好用的谷歌浏览器插件
  14. 【避坑 超详细】Ubuntu使用python的selenium以及chrome模拟真实浏览器访问网页
  15. imgui中在指定位置(非固定window方式)绘制text
  16. 怎么查看各进程分别占用多少服务器内存?
  17. 阿里内核月报:2017年05月
  18. html入门基础-边框设计(入门级)
  19. 计算机电力英语翻译,电力名词中文英语对照翻译术语词汇
  20. 读后感系列-4.《黄金是怎样炼成的》徐小平/乔慧存

热门文章

  1. [LeetCode] Factorial Trailing Zeroes
  2. CentOS6.4安装nginx1.4
  3. 黄聪:wordpress文章同步发布到网易、天涯、新浪博客、百度空间插件
  4. H3C设备之RIP v2认证
  5. POJ 1062 昂贵的聘礼
  6. 配置安装光盘为yum源
  7. 常用oracle数据库函数总结
  8. BZOJ3799 : 字符串重组
  9. ORA-03135 ,ORA-02050到底什么原因?
  10. 防止******ADSL的一些技巧