BZOJ 3339 Rmq Problem(离线+线段树+mex函数)
题意:
q次询问,问[l,r]子区间的mex值
思路:
对子区间[l,r],当l固定的时候,[l,r]的mex值对r单调不减
对询问按照l离线,对当前的l,都有维护一个线段树,每个叶节点保存[l,r]的mex
l每增大1,都要更新[l, next[l]-1],将这个区间内大于a[l]的值更新为a[l]
其中next[i]为i之后的下一个a[i]位置
代码:
线段树写的不熟。。
- #include<iostream>
- #include<cstdio>
- #include<algorithm>
- #include<cmath>
- #include<cstring>
- #include<string>
- #include<stack>
- #include<queue>
- #include<deque>
- #include<set>
- #include<vector>
- #include<map>
- #define fst first
- #define sc second
- #define pb push_back
- #define mem(a,b) memset(a,b,sizeof(a))
- #define lson l,mid,root<<1
- #define rson mid+1,r,root<<1|1
- #define lc root<<1
- #define rc root<<1|1
- //#define lowbit(x) ((x)&(-x))
- using namespace std;
- typedef double db;
- typedef long double ldb;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef pair<int,int> PI;
- typedef pair<ll,ll> PLL;
- const db eps = 1e-;
- const int mod = 1e9+;
- const int maxn = 2e6+;
- const int maxm = 2e6+;
- const int inf = 0x3f3f3f3f;
- const db pi = acos(-1.0);
- int a[maxn];
- int n, q;
- int nx[maxn];
- int lst[maxn];
- struct node{
- int l, r;
- int id;
- }b[maxn];
- bool cmp(node a, node b){
- return a.l<b.l;
- }
- int mex[maxn];
- set<int>s;
- int dat[maxn];
- void build(int l, int r, int root){
- int mid = (l+r)>>;
- if(l==r){
- dat[root] = mex[l];
- return;
- }
- dat[root] = inf;
- build(lson);
- build(rson);
- return;
- }
- void pushdown(int l, int r, int root){
- if(l==r)return;
- dat[lc]=min(dat[lc],dat[root]);
- dat[rc]=min(dat[rc],dat[root]);
- return;
- }
- int ask(int x, int l, int r, int root){
- if(dat[root]!=inf)pushdown(l, r, root);
- if(l==r)return dat[root];
- int mid = (l+r)>>;
- if(x<=mid)return ask(x,lson);
- return ask(x,rson);
- }
- void update(int x, int y, int val, int l, int r, int root){
- if(dat[root]!=inf)pushdown(l,r,root);
- if(l==x&&y==r){
- dat[root]=min(dat[root],val);return;
- }
- int mid = (l+r)>>;
- if(y<=mid)update(x,y,val,lson);
- else if(x>mid)update(x,y,val,rson);
- else{
- update(x,mid,val,lson);
- update(mid+,y,val,rson);
- }
- return;
- }
- int ans[maxn];
- int main(){
- scanf("%d %d", &n, &q);
- for(int i = ; i <= n; i++){
- nx[i]=n+;
- }
- for(int i = ; i <= n; i++){
- scanf("%d", &a[i]);
- if(lst[a[i]]){
- nx[lst[a[i]]]=i;
- }
- lst[a[i]]=i;
- }
- int tmp = ;
- for(int i = ; i <= n; i++){
- s.insert(a[i]);
- while(s.find(tmp)!=s.end()){
- tmp++;
- }
- mex[i]=tmp;
- }build(,n,);
- for(int i = ; i <= q; i++){b[i].id=i;
- scanf("%d %d", &b[i].l, &b[i].r);
- }
- sort(b+,b++q,cmp);
- int p = ;
- for(int i = ; i <= q; i++){
- while(p<b[i].l){
- //printf("\\\\%d\n",p);
- update(p,nx[p]-,a[p],,n,);
- //printf("---\n");
- p++;
- }
- //printf("==%d %d %d\n",b[i].id,b[i].l,b[i].r);
- //printf("--%d %d\n",i,ask(b[i].r,1,n,1));
- ans[b[i].id]=ask(b[i].r,,n,);
- }
- for(int i = ; i <= q; i++){
- printf("%d\n",ans[i]);
- }
- return ;
- }
- /*
- 7 5
- 0 2 1 0 1 3 2
- 1 3
- 2 3
- 1 4
- 3 6
- 2 7
- */
BZOJ 3339 Rmq Problem(离线+线段树+mex函数)的更多相关文章
- Bzoj 3339: Rmq Problem && Bzoj 3585: mex 莫队,树状数组,二分
3339: Rmq Problem Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 833 Solved: 397[Submit][Status][D ...
- BZOJ 3339: Rmq Problem 莫队算法
3339: Rmq Problem 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=3339 Description n个数,m次询问l,r ...
- BZOJ 3339: Rmq Problem
3339: Rmq Problem Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1075 Solved: 549[Submit][Status][ ...
- [BZOJ3339] Rmq Problem(线段树)
传送门 这个题的方法好像很多啊 1.莫队暴力 2.线段树 + 离线处理 先预处理出sg[i]表示前i个数的sg值,next[i]表示i的下一位置在哪里,如果后面再没有i,那么next[i] = n + ...
- bzoj 3339 Rmq Problem / mex
题目 我的树状数组怎么那么慢啊 就是一道水题,我们考虑一下对于一个区间\([l,r]\)什么样的数能被计算 显然需要对于一个\(j\),需要满足\(j<l\)且\(nxt_{j}>r\), ...
- BZOJ 3626 [LNOI2014]LCA 树剖+(离线+线段树 // 在线+主席树)
BZOJ 4012 [HNOI2015]开店 的弱化版,离线了,而且没有边权(长度). 两种做法 1 树剖+离线+线段树 这道题求的是一个点zzz与[l,r][l,r][l,r]内所有点的lcalca ...
- hdu 4288 离线线段树+间隔求和
Coder Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- bzoj2333 离线 + 线段树
https://www.lydsy.com/JudgeOnline/problem.php?id=2333 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来 ...
- BZOJ_2298_[HAOI2011]problem a_线段树
BZOJ_2298_[HAOI2011]problem a_线段树 Description 一次考试共有n个人参加,第i个人说:“有ai个人分数比我高,bi个人分数比我低.”问最少有几个人没有说真话( ...
随机推荐
- java基础之----redi分布式锁
最近项目中,用到了redis分布式锁,使用过程有些心得,所以希望分享给大家. 首先我们意识里要知道分布锁有哪些? 分布式锁一般分三种,基于数据库的乐观锁,基于redis的分布式锁,基于zookeper ...
- 还在使用OpenGL ES做渲染,你Out了,赶紧来拥抱Vulkan吧~
背景介绍 Vulkan是Khronos组织制定的"下一代"开放的图形显示API.是与DirectX12能够匹敌的GPU API标准. Vulkan是基于AMD的Mantle API ...
- linux各目录及重要目录的详细介绍
1 目录说明 根目录 (/) /bin bin是Binary的缩写, 这个目录存放着最经常使用的命令,比如ls,cat,mkdir等 /dev dev是Device(设备)的缩写, 该目录下存放的是L ...
- 侠说java8--Stream流操作学习笔记,都在这里了
前言 首次接触到Stream的时候以为它是和InputStream.OutputStream这样的输入输出流的统称. 流和集合的前世今生 概念的差异 在开发中,我们使用最多的类库之一就是集合.集合是一 ...
- 【Java基础总结】泛型
泛型实现了参数化类型的概念,使代码可以应用于多种类型. 1. 泛型类 声明的泛型类型静态方法不能使用 class Tools<T>{ private T t; public void se ...
- PQSQL 按照时间进行分组
按照时间分组时一般是按照年.月.日进行分组,不会把时分秒也算进去,所以需要把时间戳提取出所需要的时间段,本质上是把时间戳格式化成对应形式的字符串,这个过程需要用to_char(timestamp, t ...
- TensorFlow——卷积神经网络的相关函数
在TensorFlow中,使用tr.nn.conv2d来实现卷积操作,使用tf.nn.max_pool进行最大池化操作.通过闯传入不同的参数,来实现各种不同类型的卷积与池化操作. 卷积函数tf.nn. ...
- oracle的一些简单语法
1.创建主键自增: --创建序列 create sequence seq_tb_user minvalue nomaxvalue start with increment by nocycle --一 ...
- java 储存机制
1.栈 statck 局部变量名称 2.堆 heap 带new的 3.方法区 method area .class
- flash-session
作用:更改session存储的位置 1.session默认存放在浏览器的cookie中 源码 wsgi->app.__call__->wsgi_app->push->self. ...