洛谷 P4137 Rmq Problem/mex 题解
首先,由于本人太菜,不会莫队,所以先采用主席树的做法;
离散化是必须环节,否则动态开点线段数都救不了你;
我们对于每个元素i,插入到1~(i-1)的主席树中,第i颗线段树(权值线段树)对于一个区间[l,r]维护的便是原序列1~i中的所有属于[l,r]的元素出现的最后位置的最小值;
当我们查询[x,y]时,我们查询第y颗线段树,找到第一个位置使得(出现的最后位置的最小值)比(x)要小;
然后恢复离散化之前的数值,然后输出;
#include <bits/stdc++.h>
#define inc(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;
int n,m;
int a[300010];
int tot;
class node{
public:
int lson,rson;
int last;
}tree[6000010];
int lisan,tt[400010],root[300010];
int change(int pre,int l,int r,int goal,int v)
{
int now=++tot;
tree[now].lson=tree[pre].lson;
tree[now].rson=tree[pre].rson;
if(l==r){
tree[tot].last=v;
return now;
}
int mid=(l+r)/2;
if(goal<=mid) tree[now].lson=change(tree[pre].lson,l,mid,goal,v);
else tree[now].rson=change(tree[pre].rson,mid+1,r,goal,v);
tree[now].last=min(tree[tree[now].lson].last,tree[tree[now].rson].last);
return now;
}
int query(int now,int l,int r,int goal)
{
if(l==r) return tt[l];
int mid=(l+r)/2;
if(tree[tree[now].lson].last>=goal) return query(tree[now].rson,mid+1,r,goal);
else return query(tree[now].lson,l,mid,goal);
}
int main(){
scanf("%d%d",&n,&m);
tt[++lisan]=0;
inc(i,1,n){
scanf("%d",&a[i]);
tt[++lisan]=a[i]; tt[++lisan]=a[i]+1;
}
sort(tt+1,tt+1+lisan);
lisan=unique(tt+1,tt+1+lisan)-tt-1;
inc(i,1,n){
a[i]=lower_bound(tt+1,tt+1+lisan,a[i])-tt;
root[i]=tot+1;
change(root[i-1],1,lisan,a[i],i);
}
inc(i,1,m){
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",query(root[y],1,lisan,x));
}
}
或许以后会更新一篇莫队的做法
洛谷 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]为数 ...
- 洛谷P4137 Rmq Problem / mex(莫队)
题目描述 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 输入输出格式 输入格式: 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问l, ...
- 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,则插一个空 ...
- 【luogu P4137 Rmq Problem / mex】 题解
题目链接:https://www.luogu.org/problemnew/show/P4137 求区间内最大没出现过的自然数 在add时要先判断会不会对当前答案产生影响,如果有就去找下一个答案. # ...
- P4137 Rmq Problem / mex
目录 链接 思路 线段树 莫队 链接 https://www.luogu.org/problemnew/show/P4137 思路 做了好几次,每次都得想一会,再记录一下 可持久化权值线段树 区间出现 ...
- luogu P4137 Rmq Problem / mex 主席树 + 思维
Code: #include<bits/stdc++.h> #define maxn 200001 using namespace std; void setIO(string s) { ...
- Luogu P4137 Rmq Problem / mex
区间mex问题,可以使用经典的记录上一次位置之后再上主席树解决. 不过主席树好像不是很好写哈,那我们写莫队吧 考虑每一次维护什么东西,首先记一个答案,同时开一个数组记录一下每一个数出现的次数. 然后些 ...
随机推荐
- EM算法 小结
猴子吃果冻 博客园 首页 新随笔 联系 管理 订阅 随笔- 35 文章- 0 评论- 3 4-EM算法原理及利用EM求解GMM参数过程 1.极大似然估计 原理:假设在一个罐子中放着许多白球和 ...
- 第一次使用Open Live Writer写博客
写一下来试一试,感觉还是蛮有趣的.但是我并不知道写下来的文章是什么格式的,我刚才用VS Code打开看了一下好像都是二进制格式. 7.5正式入职,已经过去七天了.等培训结束就要去Base地了,新的生活 ...
- nginx变量与实列
nginx内置变量 内置变量存放在 ngx_http_core_module 模块中,变量的命名方式和apache 服务器变量是一致的.总而言之,这些变量代表着客户端请求头的内容,例如$http_u ...
- google中select添加onclick
有下拉跳转框如下所示: <select name="page" size="1" > <option onclick="refurb ...
- async for的使用
import random import asyncio async def random_number_gen(delay, start, end): while True: yield rando ...
- 查找与排序算法(Searching adn Sorting)
1,查找算法 常用的查找算法包括顺序查找,二分查找和哈希查找. 1.1 顺序查找(Sequential search) 顺序查找: 依次遍历列表中每一个元素,查看是否为目标元素.python实现代码如 ...
- 2.JSON.stringify()Object
JSON.stringify() JSON 通常用于与服务端交换数据. 在向服务器发送数据时一般是字符串. 我们可以使用 JSON.stringify() 方法将 JavaScript 对象转换为字符 ...
- Android解决AVD Hardware Buttons 和DPAD无法使用问题
如图所示按键用鼠标点击时无法响应. 解决方案: 以我创建的AVD名为Tablet为例 1.找到用户目录(我的用户目录yummy),然后进入如下目录 mac: ~/yummy/.android/avd/ ...
- [go]包管理
vendor方式 //包管理发展 go get(无版本概念) -> vendor(godep)(无版本概念) -> go modules go get github.com/tools/g ...
- 最新create-react-native-app搭建rn教程
一.前置条件: 1.nodeJS环境 2.npm 3.yarn 二.安装及项目初始化 1.安装脚手架 npm install -g create-react-native-app 2.用脚手架初始化创 ...