hdu 5289 Assignment(2015多校第一场第2题)RMQ+二分(或者multiset模拟过程)
题目链接: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模拟过程)的更多相关文章
- HDU 5289 Assignment(2015 多校第一场二分 + RMQ)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- hdu 5294 Tricks Device(2015多校第一场第7题)最大流+最短路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5294 题意:给你n个墓室,m条路径,一个人在1号墓室(起点),另一个人在n号墓室(终点),起点的那 ...
- 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 ...
- hdu 5308 (2015多校第二场第9题)脑洞模拟题,无语
题目链接:http://acm.hdu.edu.cn/listproblem.php?vol=44 题意:给你n个n,如果能在n-1次运算之后(加减乘除)结果为24的输出n-1次运算的过程,如果不能输 ...
- hdu 5301 Buildings (2015多校第二场第2题) 简单模拟
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5301 题意:给你一个n*m的矩形,可以分成n*m个1*1的小矩形,再给你一个坐标(x,y),表示黑格子 ...
- HDU 5289 Assignment(多校联合第一场1002)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- HDU 5289 Assignment(多校2015 RMQ 单调(双端)队列)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5289 Problem Description Tom owns a company and he is ...
- HDU 5288 OO's sequence (2015多校第一场 二分查找)
OO's Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- hdu 5305 Friends(2015多校第二场第6题)记忆化搜索
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5305 题意:给你n个人,m条关系,关系可以是online也可以是offline,让你求在保证所有人on ...
随机推荐
- WebRTC详解-zz
1.WebRTC目的 WebRTC(Web Real-Time Communication)项目的最终目的主要是让Web开发者能够基于浏览器(Chrome\FireFox\...)轻易快捷开发出丰富的 ...
- linux下使用indent整理代码(代码格式化)【转】
转自:https://blog.csdn.net/jiangjingui2011/article/details/7197069 常用的设置: indent -npro -kr -i8 -ts8 -s ...
- angular架构
angular架构包括以下部分: 1.模块 2.组件 3.模板 4.元数据 5.数据绑定 6.指令 7.服务 8.依赖注入 9.动画 10.变更检测 11.事件 12.表单 13.HTTP 14.生命 ...
- scrapy shell命令的【选项】简介
在使用scrapy shell测试某网站时,其返回400 Bad Request,那么,更改User-Agent请求头信息再试. DEBUG: Crawled () <GET https://w ...
- webpack3学习笔记
地址:https://segmentfault.com/a/1190000006843916 地址:https://www.chungold.com/my/course/32 地址:http://js ...
- c++中string类中的函数
C/C++ string库(string.h)提供了几个字符串查找函数,如下: memchr 在指定内存里定位给定字符 strchr 在指定字符串里定位给定字符 strcspn 返回在字符串str1里 ...
- Unix IPC之FIFO
#include "unpipc.h" #define FIFO1 "/tmp/fifo.1" #define FIFO2 "/tmp/fifo.2& ...
- performance 判断页面是以哪种方式进入的
if (window.performance) { console.info("window.performance is supported"); console.log(per ...
- Python的简单语法(一)
import sys a=3 b=4 c=5.66 d=8.0 e=complex(c,d) f=complex(float(a),float(b)) print("a is type:&q ...
- IdentityServer4揭秘---Consent(同意页面)
授权同意页面与登录一样首先要分析页面的需要什么模型元素后建立相关的模型类 界面的话就 记住选择 .按钮.RuturnUrl.以及选择的资源Scope /// <summary> /// ...