题目链接

容易发现,可能答案只有\(0\)、每个数,每个数\(+1\)

于是把这\(2n+1\)个数建立一个权值线段树,可持久化一下,每个节点记录这个子树中最后加入数加入的时间的最小值\(latest\)(好好理解一下)。

对于查询\((l,r)\),线段树上二分找到最小的\(latest<l\)的叶节点,那么答案就是这个节点代表的数。

#include <cstdio>
#include <cmath>
#include <algorithm>
#define INF 2147483647;
using namespace std;
inline int read(){
int s = 0;
char ch = getchar();
while(ch < '0' || ch > '9') ch = getchar();
while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); }
return s;
}
const int MAXN = 200010;
const int MAXNLOGN = 10000010;
struct SegTree{
int lc, rc, latest;
}t[MAXNLOGN];
int cnt, root[MAXN], n, m, a, b;
int val[MAXN], s[MAXN], num;
inline void pushup(int x){
t[x].latest = min(t[t[x].lc].latest, t[t[x].rc].latest);
}
int update(int x, int l, int r, int c, int d){
int id = ++cnt; t[id] = t[x];
if(l == r){ t[id].latest = d; return id; }
else{
int mid = (l + r) >> 1;
if(c <= mid) t[id].lc = update(t[x].lc, l, mid, c, d);
else t[id].rc = update(t[x].rc, mid + 1, r, c, d);
pushup(id); return id;
}
}
int query(int x, int l, int r, int c){
if(l == r) return val[l];
int mid = (l + r) >> 1;
if(t[t[x].lc].latest < c) return query(t[x].lc, l, mid, c);
else if(t[t[x].rc].latest < c) return query(t[x].rc, mid + 1, r, c);
return val[num] + 1;
}
struct lsh{
int val, id;
int operator < (const lsh A) const{
return val < A.val;
}
}p[MAXN];
int build(int l, int r){
int id = ++cnt;
if(l == r) return id;
int mid = (l + r) >> 1;
t[id].lc = build(l, mid);
t[id].rc = build(mid + 1, r);
pushup(id); return id;
}
int main(){
n = read(); m = read();
for(int i = 1; i <= n; ++i)
p[i].val = read(), p[i].id = i;
sort(p + 1, p + n + 2);
for(int i = 1; i <= n + 1; ++i){
s[p[i].id] = (p[i].val == p[i - 1].val ? num : ++num);
val[num] = p[i].val;
}
root[0] = build(1, num);
for(int i = 1; i <= n; ++i)
root[i] = update(root[i - 1], 1, num, s[i], i);
for(int i = 1; i <= m; ++i){
a = read(); b = read();
printf("%d\n", query(root[b], 1, num, a));
}
return 0;
}

【洛谷 P4137】 Rmq Problem / mex(主席树)的更多相关文章

  1. 洛谷 P4137 Rmq Problem /mex 解题报告

    P4137 Rmq Problem /mex 题意 给一个长为\(n(\le 10^5)\)的数列\(\{a\}\),有\(m(\le 10^5)\)个询问,每次询问区间的\(mex\) 可以莫队然后 ...

  2. 洛谷 P4137 Rmq Problem / mex

    https://www.luogu.org/problemnew/show/P4137 只会log^2的带修主席树.. 看了题解,发现有高妙的一个log做法:权值线段树上,设数i对应的值ma[i]为数 ...

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

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

  4. 洛谷 P4137 Rmq Problem/mex 题解

    题面 首先,由于本人太菜,不会莫队,所以先采用主席树的做法: 离散化是必须环节,否则动态开点线段数都救不了你: 我们对于每个元素i,插入到1~(i-1)的主席树中,第i颗线段树(权值线段树)对于一个区 ...

  5. 洛谷P4137 Rmq Problem / mex(莫队)

    题目描述 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 输入输出格式 输入格式: 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问l, ...

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

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

  7. Luogu4137 Rmq problem/mex 主席树

    传送门 用主席树水莫队题…… 我们对于前缀和建立主席树,对于主席树中的每一个叶子节点表示它对应的数字最后出现的位置的编号,非叶子节点求左右节点的最小值,那么对于每一次询问$l,r$就是在第$r$棵主席 ...

  8. P4137 Rmq Problem / mex (莫队)

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

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

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

  10. P4137 Rmq Problem / mex(主席树)

    传送门 思路: 直接上主席树,对于每个询问\((l,r)\),我们在第\(r\)个版本的主席树中查询最晚出现的小于\(l\)最小的数就行了. 因为答案可能为\(a_i+1\),所以我们在离散化的时候考 ...

随机推荐

  1. 去除空格JS

    $(document).ready(function (){//通用方法去输入框前后空格 $("form").on("change",function () { ...

  2. Linux 备份工具dump

    dump的功能很强,除了可以备份整个文件外,还能够针对目录来备份,还可以指定等级.什么意思呢?假设你的/home是独立的一个 文件系统,那你第一次进行过dump后,再进行第二次dump时,可以指定不同 ...

  3. 刷题3:给定一个数组 nums,判断 nums 中是否存在三个下标 a,b,c数相加等于targe且a,b,c不相等

    题目: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,下标 ,a ,b , c 对应数相加等于 targe 找出所有满足条件且不重复的三元组下标 解析: ...

  4. mongodb启动命令与端口设置

    一.mongodb安装和配置 1.创建tools目录,用于存放安装包 cd /usr/local mkdir -p tools cd tools 2.下载mongodb包(其它版本请自行下载) wge ...

  5. Git提交(PUSH)时记住密码 - 不用每次都输入密码

    开发使用的团队搭建好的GitLab服务器来作为项目共享开发,由于我不是最高权限,没办法把我git生成的SSH-Key放到服务器里面去,所有只好在每次提交的时候配置git config来记录密码不过期来 ...

  6. TCP的拥塞窗口和快速恢复机制的一些备忘及一点想法

    rwnd(窗口,代表接收端的处理能力).cwnd(拥塞窗口,从发送端看当前网络整体承载能力).ssthresh(快速增长切换成慢速增长的界限值) 1.慢启动,是指数增长(对面确认多少个包,就增加多少) ...

  7. 【docker】 yaml.scanner.ScannerError: mapping values are not allowed here in "./docker-compose.yml", line 60, column 35

    在启动docker-compose 时候 报错了 命令: docker-compose up -d && docker-compose logs -f 错误代码: 解决 出现这个错误的 ...

  8. Rufus软件

    Rufus软件(https://rufus.akeo.ie/)——制作启动盘必备,简易且开源.

  9. OpenStack-keystone命令行

    Keystone简介 Keystone(OpenStack Identity Service)是OpenStack框架中,负责身份验证.服务规则和服务令牌的功能, 它实现了OpenStack的Iden ...

  10. python excel导入到数据库

    import xlrd import MySQLdb def inMySQL(file_name): wb = xlrd.open_workbook(file_name) sh = wb.sheet_ ...