一个主席树题。

一开始想着直接动态开点硬搞就可以了,每次查询只要作一个类似于前缀和的东西看看区间有没有满,在主席树上二分就可以了。

但是这样是错的,因为一个权值会出现很多次……然后就错了。

所以我们考虑记录每一个权值最后出现的位置,直接开权值下标记录每一个权值最后出现的位置,因为是区间查询,所以可持久化一下,这样答案就是第一次出现位置小于$l$的最小权值,查询方法类似。

考虑到答案只可能是$a_{i} + 1, 0$,所以直接大力把$a_{i}, a_{i} + 1,0$都丢进去离散化。

注意线段树中权值0出现的位置不是inf,因为0也算自然数。

感觉离线下来也可以不用写可持久化。

自己一开始还是naive

Code:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 4e5 + ;
const int M = 5e6 + ;
const int inf = << ; int n, qn, tot = , a[N], b[N]; inline void read(int &X) {
X = ;
char ch = ;
int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline int min(int x, int y) {
return x > y ? y : x;
} namespace PSegT {
struct Node {
int lc, rc, data;
} s[M]; int root[N], nodeCnt; #define mid ((l + r) >> 1) inline void up(int p) {
if(p) s[p].data = min(s[s[p].lc].data, s[s[p].rc].data);
} void ins(int &p, int l, int r, int x, int pre, int v) {
p = ++nodeCnt;
s[p].lc = s[pre].lc, s[p].rc = s[pre].rc;
if(l == r) {
s[p].data = v;
return;
} if(x <= mid) ins(s[p].lc, l, mid, x, s[pre].lc, v);
else ins(s[p].rc, mid + , r, x, s[pre].rc, v);
up(p);
} int query(int p, int l, int r, int x) {
if(!p || l == r) return b[l]; if(s[s[p].lc].data < x) return query(s[p].lc, l, mid, x);
else return query(s[p].rc, mid + , r, x);
} } using namespace PSegT; int main() {
read(n), read(qn);
b[++tot] = ;
for(int i = ; i <= n; i++) {
read(a[i]);
b[++tot] = a[i], b[++tot] = a[i] + ;
} sort(b + , b + tot + );
tot = unique(b + , b + + tot) - b - ;
root[] = nodeCnt = ; //s[0].data = inf;
for(int i = ; i <= n; i++) {
a[i] = lower_bound(b + , b + + tot, a[i]) - b;
ins(root[i], , tot, a[i], root[i - ], i);
} for(int x, y; qn--; ) {
read(x), read(y);
printf("%d\n", query(root[y], , tot, x));
}
return ;
}

Luogu 4137 Rmq Problem / mex的更多相关文章

  1. 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex

    题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...

  2. Luogu P4137 Rmq Problem / mex

    区间mex问题,可以使用经典的记录上一次位置之后再上主席树解决. 不过主席树好像不是很好写哈,那我们写莫队吧 考虑每一次维护什么东西,首先记一个答案,同时开一个数组记录一下每一个数出现的次数. 然后些 ...

  3. 【luogu P4137 Rmq Problem / mex】 题解

    题目链接:https://www.luogu.org/problemnew/show/P4137 求区间内最大没出现过的自然数 在add时要先判断会不会对当前答案产生影响,如果有就去找下一个答案. # ...

  4. luogu P4137 Rmq Problem / mex 主席树 + 思维

    Code: #include<bits/stdc++.h> #define maxn 200001 using namespace std; void setIO(string s) { ...

  5. 洛谷$P$4137 $Rmq\ Problem / mex$ 主席树

    正解:主席树 解题报告: 传送门$QwQ$ 本来以为是道入门无脑板子题,,,然后康了眼数据范围发现并没有我想像的那么简单昂$kk$ 这时候看到$n$的范围不大,显然考虑离散化?但是又感觉似乎布星?因为 ...

  6. luogu P4137 Rmq Problem / mex(可持久化线段树)

    一开始想的是莫队,然后维护几个bitset,然后瞎搞.脑子里想了想实现,发现并不好写. 还是主席树好写.我们维护一个权值的线段树,记录每一个权值的最后一次出现的位置下标.我们查询的时候要在前\(r\) ...

  7. [bzoj3585] Rmq Problem / mex

    [bzoj3585] Rmq Problem / mex bzoj luogu 看上一篇博客吧,看完了这个也顺理成章会了( (没错这篇博客就是这么水) #include<cstdio> # ...

  8. 【Luogu4137】Rmq Problem/mex (莫队)

    [Luogu4137]Rmq Problem/mex (莫队) 题面 洛谷 题解 裸的莫队 暴力跳\(ans\)就能\(AC\) 考虑复杂度有保证的做法 每次计算的时候把数字按照大小也分块 每次就枚举 ...

  9. P4137 Rmq Problem / mex (莫队)

    题目 P4137 Rmq Problem / mex 解析 莫队算法维护mex, 往里添加数的时候,若添加的数等于\(mex\),\(mex\)就不能等于这个值了,就从这个数开始枚举找\(mex\): ...

随机推荐

  1. 20165210 Java第三周学习总结

    20165210 Java第三周学习总结 教材学习内容总结 - 第四章学习总结 编程语言的几个发展阶段: 面向机器语言 面向过程语言 面向对象语言 类: 类声明: class People { ... ...

  2. freemarker实现第一个HelloWorld

    第一步:引入freemarker jar包 第二步:创建templates下的test01.ftl 第三步:在web.xml下 第四步:编写后台代码 package com.wisezone.test ...

  3. C++对C语言的拓展(3)—— 默认参数和占位参数

    通常情况下,函数在调用时,形参从实参那里取得值.对于多次调用同一函数同一 实参时,C++给出了更简单的处理办法.给形参以默认值,这样就不用从实参那里取值了. 1.单个默认参数 若填写参数,使用你填写的 ...

  4. 在linux里建立一个快捷方式,连接到另一个目录

    ln -s 源目录 目标快捷方式比如要在/home/下面建立一个叫WIN7的快捷方式,指向/mnt/:ln -s /home/WIN7  /mnt

  5. 添加gitolite用户和仓库

    1.在linux工作机上生成密钥对 ssh-keygen -t rsa 输入用户名但不输入passphrase,这样连接时就不用每次都输入passphrase了. 2.添加用户和仓库 在管理员的工作机 ...

  6. 操作Oracle 一条龙

    1 引用Oracle.DataAccess.dll 2 App.Config中配置连接字符串: Data Source=(DESCRIPTION = (ADDRESS = (PROTOCOL = TC ...

  7. 差分IO标准

    差分标准 和单端IO不同的是,差分电平使用两根信号线来传达信号,这两根信号线在传输过程中如果遇到同样的噪声源(共模噪声)干扰,在接收端,这样的共模噪声会在两个信号相减时消除,这样并不会给接收电平造成影 ...

  8. 关于jsp和html页面中的三种弹出框

    代码: <!-- 引入jquery 由于在下面使用jquery选择器,与弹出框无关 --> <script type="text/javascript" src= ...

  9. 机器学习:决策树(CART 、决策树中的超参数)

    老师:非参数学习的算法都容易产生过拟合: 一.决策树模型的创建方式.时间复杂度 1)创建方式 决策树算法 既可以解决分类问题,又可以解决回归问题: CART 创建决策树的方式:根据某一维度 d 和某一 ...

  10. 使用jmx4perl和j4psh接管Jolokia

    在ActiveMQ的API中,内置了Jolokia . 可以使用jmx4perl来安装: $ perl -MCPAN -e shell Terminal does not support AddHis ...