BZOJ 3585: mex(分块+莫队)
##解题思路
首先直接莫队是能被卡的,时间复杂度不对。就考虑按照值域先进行分块再进行莫队,然后统计答案的时候就暴力扫所有的块,直到一个块内元素不满,再暴力扫这个块就行了,时间复杂度O(msqrt(n))
##代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=200005;
const int SIZ=600;
inline int rd(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)) f=ch=='-'?0:1,ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return f?x:-x;
}
int n,m,a[N],bl[N],siz,l[SIZ],r[SIZ],cnt[N],sum[SIZ],ans[N],num;
struct Query{
int ql,qr,id;
friend bool operator<(const Query A,const Query B){
if(A.ql/siz!=B.ql/siz) return A.ql<B.ql;
if((A.ql/siz)&1) return A.qr>B.qr;
return A.qr<B.qr;
}
}q[N];
inline void del(int x){
if(a[x]>n) return;
cnt[a[x]]--;if(!cnt[a[x]]) sum[bl[a[x]]]--;
}
inline void add(int x){
if(a[x]>n) return ;
if(!cnt[a[x]]) sum[bl[a[x]]]++;cnt[a[x]]++;
}
inline int query(){
if(!cnt[0]) return 0;int pos=-1;
for(int i=1;i<=num;i++)
if(sum[i]!=r[i]-l[i]+1) {pos=i;break;}
if(pos==-1) return n+1;
for(int i=l[pos];i<=r[pos];i++)
if(!cnt[i]) return i;
}
int main(){
n=rd(),m=rd();siz=sqrt(n)+1;num=n/siz+(n%siz!=0);
for(int i=1;i<=n;i++) a[i]=rd(),bl[i]=(i-1)/siz+1;
for(int i=1;i<=num;i++) l[i]=(i-1)*siz+1,r[i]=i*siz;r[num]=n;
for(int i=1;i<=m;i++) q[i].ql=rd(),q[i].qr=rd(),q[i].id=i;
sort(q+1,q+1+m);int L=1,R=0;
for(int i=1;i<=m;i++){
while(L<q[i].ql) {del(L);L++;}
while(L>q[i].ql) {L--;add(L);}
while(R<q[i].qr) {R++;add(R);}
while(R>q[i].qr) {del(R);R--;}
ans[q[i].id]=query();
}
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}
BZOJ 3585: mex(分块+莫队)的更多相关文章
- [BZOJ 3585] mex 【莫队+分块】
题目链接:BZOJ - 3585 题目分析 区间mex,即区间中没有出现的最小自然数. 那么我们使用一种莫队+分块的做法,使用莫队维护当前区间的每个数字的出现次数. 然后求mex用分块,将权值分块(显 ...
- bzoj 3585 mex - 线段树 - 分块 - 莫队算法
Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问 ...
- 【Luogu4137】Rmq Problem/mex (莫队)
[Luogu4137]Rmq Problem/mex (莫队) 题面 洛谷 题解 裸的莫队 暴力跳\(ans\)就能\(AC\) 考虑复杂度有保证的做法 每次计算的时候把数字按照大小也分块 每次就枚举 ...
- 【BZOJ-3809】Gty的二逼妹子序列 分块 + 莫队算法
3809: Gty的二逼妹子序列 Time Limit: 80 Sec Memory Limit: 28 MBSubmit: 1072 Solved: 292[Submit][Status][Di ...
- 2018.11.07 NOIP训练 L的鞋子(权值分块+莫队)
传送门 乱搞题. 我直接对权值分块+莫队水过了. 不过调了30min30min30min发现ststst表挂了是真的不想说什么233. 代码
- HDU 5145 分块 莫队
给定n个数,q个询问[l,r]区间,每次询问该区间的全排列多少种. 数值都是30000规模 首先考虑计算全排列,由于有同种元素存在,相当于每次在len=r-l+1长度的空格随意放入某种元素即$\bin ...
- 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex
题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...
- Bzoj 3339: Rmq Problem && Bzoj 3585: mex 莫队,树状数组,二分
3339: Rmq Problem Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 833 Solved: 397[Submit][Status][D ...
- 分块+莫队||BZOJ3339||BZOJ3585||Luogu4137||Rmq Problem / mex
题面:P4137 Rmq Problem / mex 题解:先莫队排序一波,然后对权值进行分块,找出第一个没有填满的块,直接for一遍找答案. 除了bzoj3339以外,另外两道题Ai范围都是1e9. ...
随机推荐
- 【Java】java获取request body
//方式一 public static String ReadAsChars(HttpServletRequest request) { BufferedReader br = null; Strin ...
- paper 150:GCC--GNU Compiler Collection(GNU编译器套件)
gcc命令 编程开发 gcc命令使用GNU推出的基于C/C++的编译器,是开放源代码领域应用最广泛的编译器,具有功能强大,编译代码支持性能优化等特点.现在很多程序员都应用GCC, ...
- winform防止输入法对扫码的干扰
把textbox的imemode的属性设为disable,就强制只能录入英文和半角符号,防止了中文输入法等的干扰. 参考:https://blog.csdn.net/jhycjhyc/article/ ...
- python中的__init__
__init__ __init__中__表示系统默认命名,init是初始化的意思.由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去.以学生类为例,通过定义 ...
- MySQL < > 等用法
- ES6 Generator使用
// generator介绍: function* hello() { console.log("hello world") } hello();//没有执行 // 直接调用hel ...
- iOS OpenGL ES简单绘制三角形
OpenGL 是用于2D/3D图形编程的一套基于C语言的统一接口. windows,Linux,Unix上均可兼容. OpenGL ES 是在OpenGL嵌入式设备上的版本, android/iOS ...
- 服务端:WCF服务层安全检查核心类
using System.Data; using CSFrameworkV4_5.Common; using CSFrameworkV4_5.Core.SystemSecurity; using CS ...
- EasyUI 的日期控件单击文本框显示日历
注意:可 用 ctrl+f 搜索 "_outerWidth():0" 1. jQuery.easyui.min.js1.3.2 版本 function _745(_746,_7 ...
- 存取cookies
保存: Response.Cookies["OpenID"].Value = wxobj.openid; Response.Cookies["NickName" ...