题目链接: 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. 铁乐学python_day09_作业

    练习题 1.整理函数相关知识点,写博客 2.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素, 并将其作为新列表返回给调用者. def odd_index(l): lis = [] for ...

  2. java中判断对象中属性值是否为空的函数

    public boolean checkObjFieldIsNull(Object obj) throws IllegalAccessException { boolean flag = false; ...

  3. 循环while 和 continue

    while 1: print("行动吧") # 组成:while 条件: #条件为真,则执行语句块.之后再回去判断条件是否为真,再执行....till条件为假为止. 语句块 # 条 ...

  4. Alpha 冲刺报告(9/10)

    Alpha 冲刺报告(9/10) 队名:洛基小队 峻雄(组长) 已完成:角色属性功能的测试版 明日计划:准备α版本的ppt 剩余任务:尽量完成角色属性功能 困难:缺乏编程经验,很难自己独立完成编写,只 ...

  5. AOP-Advisor-笔记

    一.Advisor接口 这个接口是一个通知者的顶层接口.它实现类持有一个通知(advice)和一个过滤器的引用.用过滤器来决定通知是否合适目标对象. 这个接口只有两个方法,所以将整个代码贴上来. /* ...

  6. No Spring WebApplicationInitializer types detected on classpath异常的解决

    1.问题描述,当配置成 时,通过地址栏访问默认路径的index.jsp报404错误,如果手动在浏览器输入“http://localhost:8080/index.jsp”,则出现源码文件,然后观察ec ...

  7. ubuntu18.04 mariadb start失败

    在Ubuntu 安装mariadb 再restart 后出现错误 journalctl -xe 发现 apparmor权限问题 AppArmor 是一款与SeLinux类似的安全框架/工具,其主要作用 ...

  8. PHP学习笔记一:谁动了你的mail(),PHP?

    PHP编写邮件发送的函数时候,会出现一个很奇怪的问题,那就是: Warning: mail(): Failed to connect to mailserver at "localhost& ...

  9. (十)T检验-第一部分

    介绍T分布.T检验.Z检验与T检验.P值.相依样本以及配对样本的非独立T检验. T分布 在到目前为止举的所有例子中,我们都假设我们知道总体参数 μ 和 σ,但很多时候,我们并不知道,我们通常只有样本, ...

  10. Jython的应用

    今天本文围绕主要内容是jython是什么.安装.简单实用. 另外说说我为什么研究jython,研究它是有一个目的的,目的是将python代码转化为jar包以供安卓方面那边人脸识别,虽说目前人脸识别像阿 ...