题目链接: 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+二分)(单调队列)的更多相关文章

  1. HDU 5289 Assignment(二分+RMQ-ST)

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

  2. HDU 5289 Assignment (二分+区间最值)

    [题目链接]click here~~ [题目大意]: 给出一个数列,问当中存在多少连续子序列,子序列的最大值-最小值<k [思路]:枚举数列左端点.然后二分枚举右端点,用ST算法求区间最值.(或 ...

  3. HDU 5289 Assignment rmq

    Assignment 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Description Tom owns a company and h ...

  4. hdu 5289 Assignment (ST+二分)

    Problem Description Tom owns a company and he is the boss. There are n staffs which are numbered fro ...

  5. HDU 5289 Assignment(单调队列)

    题意:给T足数据,然后每组一个n和k,表示n个数,k表示最大同意的能力差,接下来n个数表示n个人的能力,求能力差在k之内的区间有几个 分析:维护一个区间的最大值和最小值,使得他们的差小于k,于是採用单 ...

  6. 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...

  7. HDU 5289 Assignment [优先队列 贪心]

    HDU 5289 - Assignment http://acm.hdu.edu.cn/showproblem.php?pid=5289 Tom owns a company and he is th ...

  8. [BZOJ1044][HAOI2008]木棍分割 二分 + 单调队列优化dp + 滚动数组优化dp

    Description 有n根木棍, 第i根木棍的长度为Li,n根木棍依次连结了一起, 总共有n-1个连接处. 现在允许你最多砍断m个连接处, 砍完后n根木棍被分成了很多段,要求满足总长度最大的一段长 ...

  9. NOIP模拟 最佳序列 - 二分 + 单调队列

    题意: 各一个n(\(\le 20000\))的序列,定义纯洁序列为长度len满足\(L \le len \le R\)的序列,纯洁值为某一纯洁序列的平局值,输出所有纯洁序列中最大平均值. 分析: 二 ...

随机推荐

  1. Gerrit安装配置

    环境: CentOS 1611 + gerrit-2.11.4 (review.openstack.org) 1. 安装java1.8 (>1.7) [root@review ~]# yum i ...

  2. web开发方面会遇到哪些缓存?分别如何优化

    Web缓存定义: Web缓存游走于服务器和客户端之间,这个服务器可能是源服务器(资源所驻留的服务器Add),数量可能是1个或多个. Web缓存就在服务器-客户端之间搞监控,监控请求,并且把请求输出的内 ...

  3. K8S Deployment 命令

    创建 Deployment kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record ...

  4. [EffectiveC++]item44:将与参数无关的代码抽离templates

  5. Django在admin模块中显示auto_now_add=True或auto_now=True的时间类型列

    转载自: http://www.tuicool.com/articles/ZryE7f 在Django如果model中的列定义了auto_now_add或auto_now属性,那么这种列不会在admi ...

  6. jQuery事件处理

    浏览器的事件模型 DOM第0级事件模型 Event实例 他的属性提供了关于当前正被处理的已触发事件的大量信息.这包括一些细节,比如在哪个元素上触发的事件.鼠标事件的坐标以及键盘事件中单击了哪个键. 事 ...

  7. luogu P3369 【模板】普通平衡树(splay)

    嘟嘟嘟 突然觉得splay挺有意思,唯一不足的是这几天是一天一道,debug到崩溃. 做了几道平衡树基础题后,对这题有莫名的自信,还算愉快的敲完了代码后,发现样例都过不去,然后就陷入了无限的debug ...

  8. mybatis提取<where><if>共用代码

    mybatis项目dao层中很多sql语句都会拥有某些相同的查询条件,以<where><if test=""></if></where&g ...

  9. ORA-00600: internal error code, arguments: [kcratr_nab_less_than_odr], [1], [1498], [18713], [18720]

    数据库server出现ORA-00600[kcratr_nab_less_than_odr].不能open数据库 1.open数据库报ORA-00600[kcratr_nab_less_than_od ...

  10. 【Potplayer】视频播放器

    Potplayer——视频播放器