bzoj 3339: Rmq Problem
2016-03-31 22:33
253 查看
莫队+对值分块查找;
#include<bits/stdc++.h> #define rep(i,k,n) for(int i=k;i<=(n);i++) using namespace std; const int maxn=200005; int a[maxn],have[maxn],sum[maxn],n,s,m; struct Q{ int l,r,ans,id; }q[maxn]; bool cmp(Q a,Q b){return a.l/s==b.l/s ? a.r<b.r : a.l/s<b.l/s;} bool cmp_id(Q a,Q b){return a.id<b.id;} void solve(){ int l=1,r=0; rep(i,1,m){ for(;r<q[i].r;r++){if(!sum[a[r+1]])have[a[r+1]/s]++;sum[a[r+1]]++;} for(;r>q[i].r;r--){if(!(--sum[a[r]]))have[a[r]/s]--;} for(;l>q[i].l;l--){if(!sum[a[l-1]])have[a[l-1]/s]++;sum[a[l-1]]++;} for(;l<q[i].l;l++){if(!(--sum[a[l]]))have[a[l]/s]--;} rep(k,0,s)if(have[k]!=s){ rep(j,s*k,s*(k+1)-1) if(!sum[j]) {q[i].ans=j;break;} break; } } } int main(){//freopen("in.in","r",stdin); scanf("%d%d",&n,&m);s=sqrt(n)+1; rep(i,1,n)scanf("%d",&a[i]); rep(i,1,m){scanf("%d%d",&q[i].l,&q[i].r);q[i].id=i;} sort(q+1,q+1+m,cmp); solve(); sort(q+1,q+1+m,cmp_id); rep(i,1,m)printf("%d\n",q[i].ans); }
相关文章推荐
- 推荐一门“神经网络”相关的视频课程
- 【蓝桥杯】历届试题 核桃的数量
- ssm框架搭建一:中文乱码问题
- 3月31日学习笔记(6.0版本用Broadcast实现强制下线功能问题)
- 通讯录之FragMent的应用实列
- 杂文 职业思考
- Linux_ mkfifo 命名管道 操作
- ajax jsonp 跨域
- 领域建模
- 软考中级软件设计师考试大纲
- iOS iOS9.0 的CoreLocation定位
- boost.sha1
- PHP5.3以上版本安装ZendOptimizer扩展
- leetcode——165—— Compare Version Numbers
- 1.6-puppet测试证书
- 【更新】免费开源移动开发框架PhoneGap更新至6.0.0
- matlab中数据保存到dat格式的文件
- C++作业2
- Spring6:基于注解的Spring MVC(上篇)
- 数据结构之队列