Description

给出长度为N的序列A
M次询问,每次询问一个区间的Mex值

Mex(S) M e x ( S ) Mex(S)表示在集合S中未出现过的最小自然数
强制在线
N,M≤200000 N , M ≤ 200000 N,M\leq 200000

Solution

显然值大于n的数都是没用的

一个很自然的思路是主席树

如果我们直接用主席树维护每种数的出现次数,那我们在查找的时候是无法确定往哪边走的,因为要做减法再统计哪些位置为0

那我们可以直接维护下标
还是主席树,每个数记录它在这个位置之前最后一次出现的下标
一个区间就维护这些下标的最小值

最后要查询的时候,判断是否所有左儿子区间中的数都在查询区间中,是的话就要往右儿子走,否则就往左儿子走

时空复杂度 O(NlogN) O ( N log ⁡ N ) O(N\log N)

Code

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fod(i,a,b) for(int i=a;i>=b;i--)
#define N 200005
#define M 15000005
using namespace std;
int rt[N],t1,n,a[N],mi[M],t[M][2],n1,m;
void build(int k,int x,int l,int r,int w,int v)
{if(l==r) mi[k]=v;else{int mid=(l+r)>>1;if(w<=mid) t[k][0]=++n1,t[k][1]=t[x][1],build(t[k][0],t[x][0],l,mid,w,v);else t[k][0]=t[x][0],t[k][1]=++n1,build(t[k][1],t[x][1],mid+1,r,w,v);mi[k]=min(mi[t[k][0]],mi[t[k][1]]);}
}
int find(int k,int l,int r,int x)
{if(l==r) return l;int mid=(l+r)>>1;if(mi[t[k][0]]<x) return find(t[k][0],l,mid,x);else return find(t[k][1],mid+1,r,x);
}
int main()
{cin>>n>>m>>t1;int mx=0;fo(i,1,n) {scanf("%d",&a[i]);rt[i]=++n1;if(a[i]<=n+1) build(rt[i],rt[i-1],0,n+1,a[i],i);else n1--,rt[i]=rt[i-1];}int ans=0;fo(i,1,m){int x,y;scanf("%d%d",&x,&y);if(t1) x^=ans,y^=ans;ans=find(rt[y],0,n+1,x);printf("%d\n",ans);}
}

[JZOJ5710] Mex相关推荐

  1. BZOJ 3585: mex( 离线 + 线段树 )

    离线, 询问排序. 先处理出1~i的答案, 这样可以回答左端点为1的询问.完成后就用seq(1)将1到它下一次出现的位置前更新. 不断这样转移就OK了 ------------------------ ...

  2. 构造 ---- 最小没出现过的数(逆向构造) D. Replace by MEX

    题目链接 题目大意: 给你一个aaa序列长度为nnn,每次挑选一个位置pos∈[1,n]pos\in[1,n]pos∈[1,n],把apos=MEX(a)a_{pos}=MEX(a)apos​=MEX ...

  3. [模板] 区间mex 区间元素种数

    区间mex 问题 给定序列\({a_i}\), 每次询问给出\(l\), \(r\), 询问 \(\text{mex} \{a_i\}, i \in \{l, l+1, \cdots r\}\) 解法 ...

  4. 使用matlab进行mex编译时的路径问题mexopts

    matlab和vs 进行混合编程时总须要使用matlab编译mexFunction.cpp文件. 这些文件免不了使用include下的*.h和lib下的*.lib文件.举例说明.这次我的cpp中用到了 ...

  5. “Matlab R2016a中运行‘mex -setup’,错误使用 mex 未找到支持的编译器或 SDK”的解决办法

    目录 问题描述: 原因分析: 解决方案: 1.失败经验 2.成功方法 (1)下载MinGW-w64 C/C++ 编译器 (2)安装MinGW-w64 C/C++ 编译器 (3)设置为系统环境变量 (4 ...

  6. cmake重新编译matlab,ubuntu系统下cmake 编译matlab中mex文件

    cmake 编译工程具有独特的优势,特别对于复杂的工程更是如此.利用matlab直接编译mex文件时,对于文件数据多的工程时,需要列举所有文件,并且要按照依赖关系排 cmake 编译工程具有独特的优势 ...

  7. matlab编译错误怎么查找,matlab - Matlab mex文件编译错误-“未启用SSE2指令集” - 堆栈内存溢出...

    在Matlab中编译mex文件的工具箱时,出现以下错误: In file included from /home/josh/Desktop/Project/code/toolbox/channels/ ...

  8. matlab和C/C++混合编程--Mex

    最近的项目需要matlab和C的混合编程,经过一番努力终于完成了项目要解决的问题.现在就将Mex的一些经验总结一下,当然只是刚刚开始,以后随着学习的深入继续添加.首先讲讲写Mex的一些常规规定,然后我 ...

  9. mex+matlab2013b+vs2012安装

    要用到matlab vs混合编程... 原来的MATLAB2012b仅能支持到vs2010.这样使用 mex -setup会有问题的..找不到vs2012的编译器 好在2013b可以支持了.不用改啊改 ...

最新文章

  1. BootStrap 模态框禁用空白处点击关闭
  2. CyberLink ColorDirector Ultra(视频调色工具)中文版
  3. 学习Kotlin(五)函数与Lambda表达式
  4. 【2016年第5期】位置大数据在车辆保险风险管理中的应用
  5. 按钮、菜单的重绘代码
  6. PPT是在投影仪或者计算机上进行演示,如何将幻灯片PPT转换成视频播放
  7. Xilinx FPGA 编程技巧之常用时序约束详解
  8. laravel多国语言包
  9. matlab产生窄带信号,窄带信号
  10. 天使投资人杨宁:百度轻应用让移动时代很多不可能成为可能
  11. 工业物联网企业logo设计思路分析
  12. C++下的utility
  13. Numpy创建正态分布和均匀分布
  14. uni-app 获取手机设备各项信息
  15. AMR中的RO,RW和ZI
  16. 今日小游戏:消除棋子
  17. 【OVS2.5.0源码分析】mirror实现原理(1)
  18. 计算机程序设计基础(C语言版)pdf
  19. 站长号文库:什么是云存储?
  20. 在通达信里制作自己的指数

热门文章

  1. html div 内部居中。
  2. 【MySQL学习】事务管理
  3. 国家信息安全水平考试NISP一级模拟题(02)
  4. build tools
  5. js -- others
  6. VS2019 / 2017 / 2013 产品密钥 – 所有版本
  7. java 日期处理_java日期处理总结
  8. 操作无法完成因为文件已在syayem中打开怎么处理删除文件。
  9. 树莓派实验室python人脸识别_在树莓派上实现人脸识别
  10. 【STM32】使用BRR与BSRR寄存器控制GPIO输出