【洛谷 P4137】 Rmq Problem / mex(主席树)
题目链接
容易发现,可能答案只有\(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(主席树)的更多相关文章
- 洛谷 P4137 Rmq Problem /mex 解题报告
P4137 Rmq Problem /mex 题意 给一个长为\(n(\le 10^5)\)的数列\(\{a\}\),有\(m(\le 10^5)\)个询问,每次询问区间的\(mex\) 可以莫队然后 ...
- 洛谷 P4137 Rmq Problem / mex
https://www.luogu.org/problemnew/show/P4137 只会log^2的带修主席树.. 看了题解,发现有高妙的一个log做法:权值线段树上,设数i对应的值ma[i]为数 ...
- luogu P4137 Rmq Problem / mex 主席树 + 思维
Code: #include<bits/stdc++.h> #define maxn 200001 using namespace std; void setIO(string s) { ...
- 洛谷 P4137 Rmq Problem/mex 题解
题面 首先,由于本人太菜,不会莫队,所以先采用主席树的做法: 离散化是必须环节,否则动态开点线段数都救不了你: 我们对于每个元素i,插入到1~(i-1)的主席树中,第i颗线段树(权值线段树)对于一个区 ...
- 洛谷P4137 Rmq Problem / mex(莫队)
题目描述 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 输入输出格式 输入格式: 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问l, ...
- 洛谷$P$4137 $Rmq\ Problem / mex$ 主席树
正解:主席树 解题报告: 传送门$QwQ$ 本来以为是道入门无脑板子题,,,然后康了眼数据范围发现并没有我想像的那么简单昂$kk$ 这时候看到$n$的范围不大,显然考虑离散化?但是又感觉似乎布星?因为 ...
- Luogu4137 Rmq problem/mex 主席树
传送门 用主席树水莫队题…… 我们对于前缀和建立主席树,对于主席树中的每一个叶子节点表示它对应的数字最后出现的位置的编号,非叶子节点求左右节点的最小值,那么对于每一次询问$l,r$就是在第$r$棵主席 ...
- P4137 Rmq Problem / mex (莫队)
题目 P4137 Rmq Problem / mex 解析 莫队算法维护mex, 往里添加数的时候,若添加的数等于\(mex\),\(mex\)就不能等于这个值了,就从这个数开始枚举找\(mex\): ...
- 主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex
题面:Rmq Problem / mex 题解: 先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空 ...
- P4137 Rmq Problem / mex(主席树)
传送门 思路: 直接上主席树,对于每个询问\((l,r)\),我们在第\(r\)个版本的主席树中查询最晚出现的小于\(l\)最小的数就行了. 因为答案可能为\(a_i+1\),所以我们在离散化的时候考 ...
随机推荐
- 2019SDN第7次上机作业
2019SDN第7次上机作业 1.作业要求: 作业博客链接:https://edu.cnblogs.com/campus/fzu/fzusdn2019/homework/10165 2.具体操作步骤与 ...
- 创业小记:ALL IN才是迈出创业第一步的关键
对于创业而言,能卖出这创业第一步的,大多都经过了长期反复的心理拷问与折磨. 因为当你迈出创业的那一步,你可能需要面对的是毫无收入保障的生活,以及后果自负的结局. ALL IN才是迈出创业第一步的关键( ...
- Java_jdbc 基础笔记之六 数据库连接 (PreparedStatement)
reparedStatement 是 Statement 的子接口 * ①需要预编译 SQL 语句:PreparedStatement ps = conn.preparedStatement(sql) ...
- Aspect切面的使用实例
一.导入切面库 以maven工程为例,除了springmvc基础的库,需要导入切面库,本例aspectj为例. <properties> <aspectj.version>&l ...
- Xamarin图表开发基础教程(11)OxyPlot框架支持的图表类型
Xamarin图表开发基础教程(11)OxyPlot框架支持的图表类型 OxyPlot组件中支持7种类型的条型图表,分别为普通条形图.线型条形图.矩形条形图.差值图.龙卷风图.普通柱形图和柱形误差图, ...
- phpexcel中文手册(转)
首先到phpexcel官网上下载最新的phpexcel类,下周解压缩一个classes文件夹,里面包含了PHPExcel.php和PHPExcel的文件夹,这个类文件和文件夹是我们需要的,把class ...
- Swift编程语言中如何实现自定义类型的for-in循环(基于Swift 2.2)
我们在Swift编程语言中常常会用到for-in循环(在编程语言术语中又被称为for-each).此外,从Swift 2.2版本起,for循环将只支持for-in形式,而不支持for i = 0; i ...
- unable to lock the administration错误解决
在ubantu系统上,使用 apt-get 命令或者其相对更新的APT 管理工具时,遇到 unable to lock the administration directory (/var/lib/d ...
- keepalived双主虚拟路由配置
我使用了两台虚拟机做测试 系统centos7.3 主机A:172.16.1.123 主机B:172.16.1.124 其实和普通配置keepalived差不多,就是复制多了一个vrrp_instanc ...
- [LeetCode] 119. Pascal's Triangle II 杨辉三角 II
Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3,Return [1,3, ...