hdu5289RMQ求区间最大最小值和单调队列维护区间最大最小值
2015-07-24 08:46
459 查看
RMQ和单调队列都可以求区间最大最小值,但相对来说,单调队列更快一些
RMQ代码:
枚举左端点,二分右端点。
RMQ代码:
枚举左端点,二分右端点。
#include<iostream> #include<cstdio> #include<cstring> #include<cctype> #include<cstdlib> #include<cctype> #include<string> #include<set> #include<map> #include<vector> #include<algorithm> using namespace std; #define LL long long const LL mod=1e9+7; const int MS=1e5+10; int a[MS]; int minv[MS][20]; int maxv[MS][20]; int n,k; void RMQ_Init() { for(int i=0;i<n;i++) minv[i][0]=maxv[i][0]=a[i]; for(int j=1;(1<<j)<=n;j++) for(int i=0;i+(1<<j)-1<n;i++) { minv[i][j]=min(minv[i][j-1],minv[i+(1<<(j-1))][j-1]); maxv[i][j]=max(maxv[i][j-1],maxv[i+(1<<(j-1))][j-1]); } } int RMQ(int l,int r) { int k=0; while((1<<(k+1))<(r-l+1)) k++; int tt=min(minv[l][k],minv[r-(1<<k)+1][k]); int t=max(maxv[l][k],maxv[r-(1<<k)+1][k]); return t-tt; } int main() { int T; cin>>T; while(T--) { cin>>n>>k; for(int i=0;i<n;i++) scanf("%d",&a[i]); RMQ_Init(); LL ans=0; int l,r; for(int i=0;i<n;i++) { l=i,r=n-1; while(l+1<r) { int p=(l+r)>>1; if(RMQ(i,p)<k) l=p; else r=p; } if(RMQ(i,r)<k) ans=ans+(LL)(r-i+1); else ans=ans+(LL)(l-i+1); } cout<<ans<<endl; } return 0; }单调队列:
#include <cstdio> #include <iostream> #include <vector> #include <queue> #include<algorithm> using namespace std; #define LL long long int main() { int T; cin>>T; while(T--) { deque<LL> deq1,deq2; LL a[100010]; LL n,k; cin>>n>>k; for(int i=0;i<n;i++) scanf("%lld",&a[i]); LL ans=0; while(!deq1.empty()) deq1.pop_back(); while(!deq2.empty()) deq2.pop_back(); int i,j; for(i=0,j=0;i<n;i++) { while(!deq1.empty()&&deq1.back()<a[i]) deq1.pop_back(); deq1.push_back(a[i]); while(!deq2.empty()&&deq2.back()>a[i]) deq2.pop_back(); deq2.push_back(a[i]); while(!deq1.empty()&&!deq2.empty()&&deq1.front()-deq2.front()>=k) { ans+=(i-j); if(deq1.front()==a[j]) deq1.pop_front(); if(deq2.front()==a[j]) deq2.pop_front(); j++; } } while(j<n) { ans+=(i-j); j++; } cout<<ans<<endl; } return 0; }
相关文章推荐
- 手机连接虚拟机服务器,架构微信内网开发环境
- Flume(NG)架构设计要点及配置实践
- discuz网站数据库迁移
- [Linux & SVN] SVN介绍及Linux下SVN命令收录
- 基于Apache axis2开发Java Web服务
- Linux中断处理与定时器
- 在Linux上安装ipmitool
- Microsoft.Windows.TimedPowerShell.DiscoveryProvider 的介绍
- Centos6.5添加Epel和Remi源安装Lamp环境
- Sqoop 1.99.3 安装
- 【学习笔记】Linux的命令总结(三)
- linux中mmap文件到内存中,该进程发生错误被挂掉后mmap映射的内存能否写回到文件中的问题
- Apache rewrite配置注意事项
- linux 关于session缓存丢失,自己掉坑里面了
- CentOS-7磁盘扩容之殇
- [Linux C]自己写的串口缓冲区
- Apache Thrift设计概要
- dom4j_Tomcat入门
- [嵌入式Linux驱动]S5PV210的烟雾传感器Linux驱动
- ubuntu 12.04下编译安装nginx-1.9.3之后 tomcat集群