博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【清华集训2014】mex
阅读量:4986 次
发布时间:2019-06-12

本文共 963 字,大约阅读时间需要 3 分钟。

题目

有一个长度为n的数组{a1,a2,...,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。

分析

显然,当\(a_i>n\)时,对答案没有影响,所以全部视为n+1。

有两种方法,主席树和权值线段树。
主席树裸题,就讲权值线段树。
首先将询问按r排序,将1~r的\(a_i\)全部加入权值线段树,记录它最晚出现的位置,对于每个区间记录这个区间中每个数最晚出现的位置的最小值mn。
查询一个l,当\(该区间左儿子的mn<l\),显然左儿子中有个\(a_i\)不在区间[l,r]中,就查询左儿子,否则查询右儿子。

#include 
#include
#include
#include
#include
#include
#include
const int maxlongint=2147483647;const int mo=1000000007;const int N=200005;using namespace std;int a[N],pos[N*5],mn[N*5],n,m,ans[N],lim;struct ddx{ int x,y,z;}re[N];bool cmp(ddx x,ddx y){ return x.y
n) a[i]=n+1; } for(int i=1;i<=m;i++) { scanf("%d%d",&re[i].x,&re[i].y); re[i].z=i; } sort(re+1,re+1+m,cmp); lim=1; for(int i=1;i<=m;i++) { while(re[i].y>=lim) { put(0,n+1,1,a[lim],lim); lim++; } ans[re[i].z]=find(0,n+1,1,re[i].x); } for(int i=1;i<=m;i++) { printf("%d\n",ans[i]); }}

转载于:https://www.cnblogs.com/chen1352/p/9066571.html

你可能感兴趣的文章
java内存模型优化建议
查看>>
三十、模块补充
查看>>
流程审批设计
查看>>
别装了,你根本就不想变成更好的人
查看>>
数据库 join
查看>>
AES加密工具类[亲测可用]
查看>>
方法区
查看>>
Django-----ORM
查看>>
ARCGIS部分刷新
查看>>
发 零 食
查看>>
poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)
查看>>
洛谷P1886 滑动窗口
查看>>
Shell编程(二)Bash中调用Python
查看>>
主动与被动监控 拓扑图组合图 自定义监控
查看>>
SQL总结(一)基本查询
查看>>
PDF分割--可脱离python环境执行,可传参数,可弹窗的PC端小工具
查看>>
cas-client-core单点登录排除不需要拦截的URL
查看>>
OCR技术浅探 : 文字定位和文本切割(2)
查看>>
jmeter集合点
查看>>
Java类代码块执行顺序
查看>>