题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289

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

思路:求出区间的最大最小值,只要他们的差值小于k,那么这个区间就符合要求,但是由于n较大,用暴力一定超时,所以就要用别的方法了;而RMQ是可以求区间的最值的,而且预处理的复杂度只有O(nlogn),而查询只是O(1)处理,这样相对来说节约了时间,再根据右端点来二分枚举左端点(其实不用二分好像更快,估计是数据问题)。

而另一种方法不得不说,学了C++的一定要在认真的去看一下STL的那些用法,这次用multiset来做就大大的节约时间,而且又不用思考太多,只要从左到右模拟区间,就可以了。

(RMQ+二分)代码:

 #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
#define LL __int64
#define INF 0x3f3f3f3f
const int MAXN=;
#define mod 1000000007 int a[MAXN];
LL ans;
int dp1[MAXN][],dp2[MAXN][]; void init(int n)
{
for(int i=;i<=n;i++)
dp1[i][]=dp2[i][]=a[i];
for(int j=;(<<j)<=n;j++)
{
for(int i=;i+(<<j)-<=n;i++)
{
dp1[i][j]=max(dp1[i][j-],dp1[i+(<<(j-))][j-]);
dp2[i][j]=min(dp2[i][j-],dp2[i+(<<(j-))][j-]);
}
}
} int RMQ(int L,int R)
{
int k=;
while((<<(k+))<=R-L+)k++;
return max(dp1[L][k],dp1[R-(<<k)+][k])-min(dp2[L][k],dp2[R-(<<k)+][k]);
} int binarySearch(int L,int R,int n,int k)
{
int mid;
int l=L,r=R;
while(l<=r)
{
mid=(l+r)/;
if(RMQ(mid,R)>=k)
{
l=mid+;
}
else
{
r=mid-;
}
}
if(RMQ(mid,R)>=k)
mid++;
return mid;
}
int main()
{
int T,i,j,n,k,mi,ma,l,r;
while(~scanf("%d",&T))
{
while(T--)
{
scanf("%d%d",&n,&k);
for(i=;i<=n;i++)
scanf("%d",&a[i]);
if(!k)
{
printf("0\n");
continue;
}
if(k==)
{
printf("%d\n",n);
continue;
}
init(n);
ans=;
for(i=j=;i<=n;i++)
{
j=binarySearch(j,i,n,k);
ans+=i-j+;
}
printf("%I64d\n",ans);
}
}
return ;
}

(STL)代码:

 #include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
#define LL __int64
#define INF 0x3f3f3f3f
const int MAXN=;
#define mod 1000000007 int a[];
LL ans;
int main()
{
int T,i,j,n,k,mi,ma,l,r;
while(~scanf("%d",&T))
{
while(T--)
{
scanf("%d%d",&n,&k);
for(i=;i<n;i++)
scanf("%d",&a[i]);
if(!k)
{
printf("0\n");
continue;
}
if(k==)
{
printf("%d\n",n);
continue;
}
l=;
r=;
multiset<int>s;
s.insert(a[]);
ans=n;
while()
{
if(s.size())
{
mi=*s.begin();
ma=*s.rbegin();
if(abs(a[r]-mi)<k&&abs(a[r]-ma)<k)
{
ans+=s.size();
s.insert(a[r]);
r++;
if(r==n)
break;
}
else
{
if(s.size())
s.erase(s.find(a[l]));
l++;
}
}
else
{
l=r;
s.insert(a[r]);
r++;
if(r==n)
break;
}
}
printf("%I64d\n",ans);
}
}
return ;
}

hdu 5289 Assignment(2015多校第一场第2题)RMQ+二分(或者multiset模拟过程)的更多相关文章

  1. HDU 5289 Assignment(2015 多校第一场二分 + RMQ)

    Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  2. hdu 5294 Tricks Device(2015多校第一场第7题)最大流+最短路

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294   题意:给你n个墓室,m条路径,一个人在1号墓室(起点),另一个人在n号墓室(终点),起点的那 ...

  3. hdu 5288 OO’s Sequence(2015多校第一场第1题)枚举因子

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5288 题意:在闭区间[l,r]内有一个数a[i],a[i]不能整除 除去自身以外的其他的数,f(l,r ...

  4. hdu 5308 (2015多校第二场第9题)脑洞模拟题,无语

    题目链接:http://acm.hdu.edu.cn/listproblem.php?vol=44 题意:给你n个n,如果能在n-1次运算之后(加减乘除)结果为24的输出n-1次运算的过程,如果不能输 ...

  5. hdu 5301 Buildings (2015多校第二场第2题) 简单模拟

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5301 题意:给你一个n*m的矩形,可以分成n*m个1*1的小矩形,再给你一个坐标(x,y),表示黑格子 ...

  6. HDU 5289 Assignment(多校联合第一场1002)

    Assignment Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

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

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

  8. HDU 5288 OO&#39;s sequence (2015多校第一场 二分查找)

    OO's Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  9. hdu 5305 Friends(2015多校第二场第6题)记忆化搜索

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5305 题意:给你n个人,m条关系,关系可以是online也可以是offline,让你求在保证所有人on ...

随机推荐

  1. Libheap:一款用于分析Glibc堆结构的GDB调试工具

    Libheap是一个用于在Linux平台上分析glibc堆结构的GDB调试脚本,使用Python语言编写.         安装 Glibc安装 尽管Libheap不要求glibc使用GDB调试支持和 ...

  2. https://www.yunpanjingling.com/

    https://www.yunpanjingling.com/ 账号  kein20 passwd a1234

  3. 一、springboot入门

    构建spring boot工程一般采用两种方式 gradle .maven maven方式 pom.xml spring-boot-starter:核心模块,包括自动配置支持.日志和YAML spri ...

  4. 你的组织使用了 windows defender 应用程序控制来阻止此应用

    =============================================== 2018/2/8_第1次修改                       ccb_warlock === ...

  5. 使用的vue、elementUI、vuex、express、mongoDB的单页应用

    基于vue.vuex.express.mongodb的一个单页应用,包括前后端,前端主要是使用vue,后端是node的express,数据库是使用的mongodb 1.下载使用 git clone h ...

  6. centos7联网

    一般centos安装(在虚拟机上安装)完成后需要自己配置服务,下面我就讲下如何配置 配置联网步骤 首先,打开虚拟机的两个服务,右击我的电脑-->管理--->找到服务-->右击启动 两 ...

  7. R语言学习笔记:sort、rank、order、arrange排序函数

    R语言中排序有几个基本函数:sort().rank().order().arrange() 一.总结 sort()函数是对向量进行从小到大的排序 rank()函数返回的是对向量中每个数值对应的秩 or ...

  8. 有关c语言编程

    有关C语言编程 统计代码"行数" 对于统计代码"行数",行数不包括空白行和注释行.程序改进如下: while(fgets (mystring , 100 , f ...

  9. 2016-2017-2 20155309南皓芯java第四周学习总结

    教材内容总结 这次我们学习的还是两章的内容,学习任务量跟上次比的话大体上来讲是差不多的. 继承与多态 继承 继承也符合DRY(Don't Repeat Yourself)原则 Role role1 = ...

  10. Linux下的堆伪造漏洞利用技术(new unlink)

    感觉markdown的文件格式看起来更清晰一些就写成附加的形式了.Download 更正:这种利用方式不叫House of Mind,是我搞混了.