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\)的序列,纯洁值为某一纯洁序列的平局值,输出所有纯洁序列中最大平均值. 分析: 二 ...
随机推荐
- RAC性能分析 - gc buffer busy acquire 等待事件
概述---------------------gc buffer busy是RAC数据库中常见的等待事件,11g开始gc buffer busy分为gc buffer busy acquire和gc ...
- 固定UILabel宽度分行显示
固定UILabel宽度分行显示 这种小伎俩估计都被用烂了,笔者给大家提供一个category文件,供大家简单设置哦. 各种富文本效果哦(普通文本也是可以用的呢): 3行,固定宽度200 2行,固定宽度 ...
- 北美Developer生存发展攻略
http://www.followmedoit.com/bbs/forum.php?mod=viewthread&tid=49&extra=page%3D1 在北美,做PM不易,而做D ...
- Linux系统优化实现高并发
ulimit -SHn 65535内核优化net.ipv4.ip_forward = 1 #开启路由功能net.ipv4.conf.default.rp_filter = 1 ...
- CSS学习摘要-引入样式
CSS学习摘要-引入样式 注:主要是摘录自MDN 网络开发者这个网站的. CSS 实际上如何工作? 当浏览器显示文档时,它必须将文档的内容与其样式信息结合.它分两个阶段处理文档: 浏览器将 HTML和 ...
- Ubuntn系统(虚拟机)忘记密码的解决方法
1.重启ubuntu系统,开机时长按shift按键进入GRUB菜单,选择第二个高级选项,enter键进入.如下图: 2.在高级选择中选择Recovery mode模式,键盘按“e”键进入编辑模式.如下 ...
- win中使用cmd杀端口
最近在win开发时,总是遇到端口占用的情况...可能是跑的程序太多了吧 当你测试一个demo时遇到这个就很恶心.. 记一下 netstat -ano | findstr 80 //列出进程极其占用的端 ...
- zabbix对网卡流量超出添加阈值
给网卡设置流量阈值: 配置告警路径: Configuration--Templates--Template OS Linux--Discovery--Network interface discove ...
- python subprocess 和 multiprocess选择以及我遇到的坑
The subprocess option: subprocess is 用来执行其他的可执行程序的,即执行外部命令. 他是os.fork() 和 os.execve() 的封装. 他启动的进程不会把 ...
- 64. [Mcoi2018]终末之诗(上)
Description 求出\(k^{k^{k^{k^{...}}}} \pmod p\) 的结果 扩展欧拉定理:\[a^x=a^{min(x,x\%\varphi(p)+\varphi(p))}(m ...