HDU - 5289 Assignment (RMQ+二分)(单调队列)
题目链接: Assignment
题意:
给出一个数列,问其中存在多少连续子序列,使得子序列的最大值-最小值<k。
题解:
RMQ先处理出每个区间的最大值和最小值(复杂度为:n×logn),相当于求出了每个区间的最大值-最小值。那么现在我们枚举左端点,二分右端点就可以在n×logn×logn的时间内过。
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5+;
int vec[MAX_N];
int dp1[MAX_N][];
int dp2[MAX_N][];
long long ans = ;
int N,M,T;
void ST(int N)
{
for(int i=;i<=N;i++) dp1[i][] = dp2[i][] = vec[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++;
int maxn = max(dp1[l][k],dp1[r-(<<k)+][k]);
int minn = min(dp2[l][k],dp2[r-(<<k)+][k]);
return maxn-minn;
}
int main()
{
cin>>T;
while(T--)
{
cin>>N>>M;
ans = ;
for(int i=;i<=N;i++) scanf("%d",&vec[i]);
ST(N);
for(int i=;i<=N;i++)
{
int l =i,r = N;
while(l<=r)
{
int mid = (l+r)>>;
if(RMQ(i,mid) < M) l = mid+;
else r = mid-;
}
ans += (l-) - i +;
}
cout<<ans<<endl;
}
return ;
}
还有一种解法是用两个单调队列维护区间的最大和最小值,让我收益颇多@。@!用双端队列构成单调队列,一个维护最大值,一个维护最小值,从左向右枚举右端点。现在我们知道了这个区间的最大值和最小值,如果最大值减去最小值是小于k的则当前的左端点到右端点里面所有的区间都是符合条件的。直到枚举到一个右端点,使得最大值减最小值>=k,则开始移动左端点删去两个队列中左端点的值(如果有的话),直到区间重新符合条件。用单调队列处理的话复杂度为(O(n))。
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 1e5+;
long long vec[MAX_N];
deque<long long> que1,que2;
int main()
{
long long N,M,T;
cin>>T;
while(cin>>N>>M)
{
while(!que1.empty()) que1.pop_back();
while(!que2.empty()) que2.pop_back();
for(int i=;i<N;i++) scanf("%lld",&vec[i]);
int pos = ;
long long ans = ;
for(int i=;i<N;i++)
{
while(!que1.empty() && que1.back() < vec[i]) que1.pop_back();
que1.push_back(vec[i]);
while(!que2.empty() && que2.back() > vec[i]) que2.pop_back();
que2.push_back(vec[i]);
while(!que1.empty() && !que2.empty() && que1.front() - que2.front() >= M)
{
ans += (i-pos);
if(que1.front() == vec[pos]) que1.pop_front();
if(que2.front() == vec[pos]) que2.pop_front();
pos++;
}
}
while(pos < N)
{
ans += (N-pos);
pos ++;
}
cout<<ans<<endl;
}
return ;
}
HDU - 5289 Assignment (RMQ+二分)(单调队列)的更多相关文章
- HDU 5289 Assignment(二分+RMQ-ST)
Assignment Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total ...
- HDU 5289 Assignment (二分+区间最值)
[题目链接]click here~~ [题目大意]: 给出一个数列,问当中存在多少连续子序列,子序列的最大值-最小值<k [思路]:枚举数列左端点.然后二分枚举右端点,用ST算法求区间最值.(或 ...
- HDU 5289 Assignment rmq
Assignment 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Description Tom owns a company and h ...
- hdu 5289 Assignment (ST+二分)
Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered fro ...
- HDU 5289 Assignment(单调队列)
题意:给T足数据,然后每组一个n和k,表示n个数,k表示最大同意的能力差,接下来n个数表示n个人的能力,求能力差在k之内的区间有几个 分析:维护一个区间的最大值和最小值,使得他们的差小于k,于是採用单 ...
- 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...
- HDU 5289 Assignment [优先队列 贪心]
HDU 5289 - Assignment http://acm.hdu.edu.cn/showproblem.php?pid=5289 Tom owns a company and he is th ...
- [BZOJ1044][HAOI2008]木棍分割 二分 + 单调队列优化dp + 滚动数组优化dp
Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...
- NOIP模拟 最佳序列 - 二分 + 单调队列
题意: 各一个n(\(\le 20000\))的序列,定义纯洁序列为长度len满足\(L \le len \le R\)的序列,纯洁值为某一纯洁序列的平局值,输出所有纯洁序列中最大平均值. 分析: 二 ...
随机推荐
- [翻译] iOSSharedViewTransition
iOSSharedViewTransition iOS 7 based transition library for View Controllers having a Common View 基于i ...
- Python学习---爬虫学习[requests模块]180411
模块安装 安装requests模块 pip3 install requests 安装beautifulsoup4模块 [更多参考]https://blog.csdn.net/sunhuaqiang1/ ...
- 铁乐学python-面向对象的更多说明
以下内容摘自授课老师的博客http://www.cnblogs.com/Eva-J/ 面向对象的更多说明 面向对象的软件开发 很多人在学完了python的class机制之后,遇到一个生产中的问题,还是 ...
- javascript unshift()和shift()
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- SuperMap/PlottingSymbol
https://github.com/SuperMap/PlottingSymbol
- AOP的本质
AOP的本质是HOOK: HOOK的本质是:新函数包含原函数或新函数替换原函数: 需要解决的问题: 1.新函数的生成: 2.新函数的调用机制: 3.原函数的调用机制: 新函数的生成: 1.将已有的动态 ...
- 1854. [SCOI2010]游戏【二分图】
Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性 ...
- 【CF662C】Binary Table
题目 好吧,我连板子都不会了 有一个非常显然的做法就是\(O(2^nm)\)做法就是枚举每一行的状态,之后我们贪心去看看每一列是否需要翻转就好啦 显然这个做法非常垃圾过不去 首先我们发现每一列都不超过 ...
- C# winform webbrowser如何指定内核为IE11?
1)假设你应用程序的名字为MyApplication.exe 2)运行Regedit,打开注册表,找到 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsof ...
- [源码分析]ArrayList
add public boolean add(E e) { //先确保数组容量 ensureCapacityInternal(size + 1); //直接将值放在size位置 elementData ...