bzoj3339 rmq problem (range mex query)
给一个长度为n的数列a,q个询问,每次询问一段区间的mex。(没有出现过的最小非负整数)
1<=n,q<=200000,0<=ai<=200000。
题解1 莫队
我们将权值分成根号块,记录每个权值的出现次数和每块内有多少权值出现过。
修改和询问就直接暴力做就行。
修改O(1),询问O(sqrt(n)),加在一起还是O((n+q)sqrt(n+q))。
- #include <iostream>
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <algorithm>
- using namespace std;
- #define SZ 666666
- int n,q,a[SZ],ts[SZ],tc[SZ],gg,bk,anss[SZ];
- void edt(int p,int x)
- {
- tc[p/gg]-=(bool)ts[p];
- ts[p]=x;
- tc[p/gg]+=(bool)ts[p];
- }
- struct query {int l,r,id;} qs[SZ];
- bool operator < (query a,query b)
- {
- int ap=a.l/bk, bp=b.l/bk;
- if(ap==bp) return a.r<b.r;
- return ap<bp;
- }
- void add(int p) {edt(p,ts[p]+1);}
- void del(int p) {edt(p,ts[p]-1);}
- #define gc getchar()
- int g_i()
- {
- int tmp=0; bool fu=0; char s;
- while(s=gc,s!='-'&&(s<'0'||s>'9')) ;
- if(s=='-') fu=1; else tmp=s-'0';
- while(s=gc,s>='0'&&s<='9') tmp=tmp*10+s-'0';
- if(fu) return -tmp; else return tmp;
- }
- #define gi g_i()
- #define pob
- #define pc(x) putchar(x)
- namespace ib {char b[100];}
- inline void pint(int x)
- {
- if(x==0) {pc(48); return;}
- if(x<0) {pc('-'); x=-x;}
- char *s=ib::b;
- while(x) *(++s)=x%10, x/=10;
- while(s!=ib::b) pc((*(s--))+48);
- }
- int main()
- {
- n=gi, q=gi;
- for(int i=1;i<=n;i++) a[i]=gi;
- gg=sqrt(200000);
- bk=min(int(sqrt(n)+1),n);
- for(int i=1;i<=q;i++) qs[i].id=i, qs[i].l=gi, qs[i].r=gi;
- sort(qs+1,qs+1+q);
- int cl=1,cr=0;
- for(int i=1;i<=q;i++)
- {
- int l=qs[i].l,r=qs[i].r;
- while(cr<r) add(a[++cr]);
- while(cr>r) del(a[cr--]);
- while(cl>l) add(a[--cl]);
- while(cl<l) del(a[cl++]);
- int nof=0;
- for(int j=0;;j++)
- {
- if(tc[j]!=gg) {nof=j; break;}
- }
- for(int j=nof*gg;;j++)
- {
- if(!ts[j]) {anss[qs[i].id]=j; break;}
- }
- }
- for(int i=1;i<=q;i++) {pint(anss[i]); pc(10);}
- }
题解2 线段树
我们这么考虑,从小到大加入所有权值。如果有一个权值正好没有经过,这个权值就可以作为答案,就可以退出了。
现在我们考虑对于一个权值,所有不包括它的区间都可以以它作为答案,那么我们就把同样是这个权值的搞出来,那么这个序列就会被搞成几段,那么每一段内的询问都可以更新答案。
那么我们就二维线段树即可。我tm才不想写
bzoj3339 rmq problem (range mex query)的更多相关文章
- BZOJ3339 Rmq Problem
[bzoj3339]Rmq Problem Description Input Output Sample Input 7 5 0 2 1 0 1 3 2 1 3 2 3 1 4 3 6 2 7 Sa ...
- [bzoj3339]Rmq Problem||[bzoj3585]mex_线段树
Rmq Problem bzoj-3339||mex bzoj-3585 题目大意:给定一个长度为n的数列a,多次讯问区间l,r中最小的不属于集合{$A_l,A_{l+1}...A_r$}的非负整数. ...
- [BZOJ3339]Rmq Problem / mex
Description: 有一个长度为n的数组{a1,a2,-,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Hint: \(n \le 2*10^5\) Solution: 主席树好 ...
- 【BZOJ】3339: Rmq Problem & 3585: mex(线段树+特殊的技巧)
http://www.lydsy.com/JudgeOnline/problem.php?id=3585 好神的题. 但是!!!!!!!!!!!!!!我线段树现在要开8倍空间才能过!!!!!!!!!! ...
- 【莫队算法】【权值分块】bzoj3339 Rmq Problem
如题. #include<cstdio> #include<algorithm> #include<cmath> using namespace std; #def ...
- [BZOJ3339] Rmq Problem(线段树)
传送门 这个题的方法好像很多啊 1.莫队暴力 2.线段树 + 离线处理 先预处理出sg[i]表示前i个数的sg值,next[i]表示i的下一位置在哪里,如果后面再没有i,那么next[i] = n + ...
- RMQ(Range Minimum Query)问题(转)
问题描述 RMQ问题是求给定区间中的最值问题.对于长度为n的数列A,回答若干查询RMQ(A, i, j).返回数组A中下标在[i,j]里的最小值的下标. 比如数列 5,8,1,3,6,4,9,5,7 ...
- 分块+莫队||BZOJ3339||BZOJ3585||Luogu4137||Rmq Problem / mex
题面:P4137 Rmq Problem / mex 题解:先莫队排序一波,然后对权值进行分块,找出第一个没有填满的块,直接for一遍找答案. 除了bzoj3339以外,另外两道题Ai范围都是1e9. ...
- BZOJ3339&&3585 Rmq Problem&&mex
BZOJ3339&&3585:Rmq Problem&&mex Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最 ...
随机推荐
- gif动图快速制作方法(附工具)
现在写博客或是wiki的过程中,会经常引用到图片,特别是客户端经常与页面相关所以截图不可避.但是越来越多的效果仅仅一张图片是无法清楚的描述.并且博客或是wiki也是支持gif图的.gif图的制作方法有 ...
- tomcat内存溢出处理
tomcat内存溢出设置JAVA_OPTS 答案1设置Tomcat启动的初始内存 其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4.可以利用JVM提供的-Xmn ...
- 你真的了解UIWindow吗?
一:首先查看一下关于UIWindow的定义 NS_CLASS_AVAILABLE_IOS(2_0) @interface UIWindow : UIView //window的屏幕,默认是 [UISc ...
- iOS多线程解析
在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项.当然也会给出几种多线程的案例,在实际使用中感受它们的区别.还有一点需要说明的是,这篇文章将会使用 Swift 和 ...
- 联通烽火hg220桥接tplink路由器
转载请注明:from http://www.cnblogs.com/juandx/p/5544517.html 1.普通账户:user(7fnmmnml,默认是bdettbr0),猫背后可见 2.工程 ...
- 用Phaser实现Flappy Bird 游戏
How to Make a Flappy Bird in HTML5 With Phaser - Part 1 Flappy Bird is a nice little game with easy ...
- C# 表复制和数据行的复制说明(Clone、ImportRow 、Copy )
/// <summary> /// 构建测试数据表 /// </summary> /// <returns></returns> private Dat ...
- Tomcat源码解读:ClassLoader的设计
Tomcat是一个经典的web server,学习tomcat的源码对于我们是有很大的帮助的.前一段时间了解了tomcat的工作的大致流程,对我的新工作有了很大的帮助.刚学习了ClassLoader( ...
- fopen()、 file_get_contents() 通过url获取链接内容
功能:获得网页内容 区别如下: fopen()打开URL 下面是一个使用fopen()打开URL的例子: <?php $fh = fopen('http://www.baidu.com/', ' ...
- 0010《SQL必知必会》笔记06-表的修改与删除
1.表的修改: 1.1 删除列:ALTER TABLE 表名 DROP COLUMN 列名 1.2 添加列:ALTER TABLE 表名 ADD(列名 数据类型) 1.3 修改列名:ALTER TAB ...