洛谷 P4137 Rmq Problem / mex
https://www.luogu.org/problemnew/show/P4137
只会log^2的带修主席树。。
看了题解,发现有高妙的一个log做法:权值线段树上,设数i对应的值ma[i]为数i首次出现的位置(没有出现就是n+1)
如果把询问按左端点排序,这样就转化为:修改:...;询问:询问[1,r]的答案
修改问题不大
询问[1,r]就转化为查询当前权值线段树上最小的数i,其对应的ma[i]>r;维护一下区间最大值,然后线段树上二分即可
可持久化一下线段树,还可以支持在线
。。。好吧可持久化的话有点卡空间,发现mex一定<=n,那么线段树可以少开一点
哎,还是思路不够灵活啊...
跑的极其慢?
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<map>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
namespace S
{
const int N=;
int maxn[N],lc[N],rc[N];
int mem;
int getnode(int f)
{
int t=++mem;
maxn[t]=maxn[f];lc[t]=lc[f];rc[t]=rc[f];
return t;
}
void setx(int L,int x,int l,int r,int &num)
{
num=getnode(num);
if(l==r) {maxn[num]=x;return;}
int mid=l+((r-l)>>);
if(L<=mid) setx(L,x,l,mid,lc[num]);
else setx(L,x,mid+,r,rc[num]);
maxn[num]=max(maxn[lc[num]],maxn[rc[num]]);
}
int getx(int R,int l,int r,int num)
{
if(l==r) return l;
int mid=l+((r-l)>>);
if(maxn[lc[num]]>R) return getx(R,l,mid,lc[num]);
else return getx(R,mid+,r,rc[num]);
}
}
int rt[];
int a[],nxt[];
int n,m;
map<int,int> ma;
const int ld=,rd=;
int main()
{
int i,l,r;
S::maxn[]=0x3f3f3f3f;
scanf("%d%d",&n,&m);
for(i=;i<=n;i++) scanf("%d",&a[i]);
for(i=n;i>=;i--)
{
nxt[i]=ma.count(a[i])?ma[a[i]]:n+;
ma[a[i]]=i;
if(a[i]<=n) S::setx(a[i],i,ld,rd,rt[]);
//printf("1a %d %d\n",a[i],i);
}
for(i=;i<=n;i++)
{
rt[i]=rt[i-];
if(a[i-]<=n) S::setx(a[i-],nxt[i-],ld,rd,rt[i]);
//printf("%da %d %d\n",i,a[i-1],nxt[i-1]);
}
while(m--)
{
scanf("%d%d",&l,&r);
printf("%d\n",S::getx(r,ld,rd,rt[l]));
}
return ;
}
洛谷 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(莫队)
题目描述 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. 输入输出格式 输入格式: 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问l, ...
- 洛谷 P4137 Rmq Problem/mex 题解
题面 首先,由于本人太菜,不会莫队,所以先采用主席树的做法: 离散化是必须环节,否则动态开点线段数都救不了你: 我们对于每个元素i,插入到1~(i-1)的主席树中,第i颗线段树(权值线段树)对于一个区 ...
- 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
目录 链接 思路 线段树 莫队 链接 https://www.luogu.org/problemnew/show/P4137 思路 做了好几次,每次都得想一会,再记录一下 可持久化权值线段树 区间出现 ...
- Luogu P4137 Rmq Problem / mex
区间mex问题,可以使用经典的记录上一次位置之后再上主席树解决. 不过主席树好像不是很好写哈,那我们写莫队吧 考虑每一次维护什么东西,首先记一个答案,同时开一个数组记录一下每一个数出现的次数. 然后些 ...
- 【luogu P4137 Rmq Problem / mex】 题解
题目链接:https://www.luogu.org/problemnew/show/P4137 求区间内最大没出现过的自然数 在add时要先判断会不会对当前答案产生影响,如果有就去找下一个答案. # ...
- luogu P4137 Rmq Problem / mex 主席树 + 思维
Code: #include<bits/stdc++.h> #define maxn 200001 using namespace std; void setIO(string s) { ...
随机推荐
- poj3295 Tautology —— 构造法
题目链接:http://poj.org/problem?id=3295 题意: 输入由p.q.r.s.t.K.A.N.C.E共10个字母组成的逻辑表达式, 其中p.q.r.s.t的值为1(true)或 ...
- PHP 导出office打开乱码
Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name); ...
- 使用XMLHttpRequest
请求种类 通过XMLHttpRequest的请求可以通过同步和异步的方式获取数据,请求的种类在XMLHttpRequest的open()方法的第三三个可选参数async设置.如果这个参数是true或者 ...
- 理解 Android Fragment
/***************************************************************************************** * 理解 Andr ...
- 页面刷新 方法总结 JSP刷新[转]
1) <meta http-equiv="refresh"content="10;url=跳转的页面"> 10表示间隔10秒刷新一次 2) < ...
- BZOJ_4154_[Ipsc2015]Generating Synergy_KDTree
BZOJ_4154_[Ipsc2015]Generating Synergy_KDTree Description 给定一棵以1为根的有根树,初始所有节点颜色为1,每次将距离节点a不超过l的a的子节点 ...
- python与c#的交互模块pythonnet
今天总结一下python与c#的交互模块pythonnet,其实微软也是有相应的解释器的,就是Ironpython,可是毕竟Ironpython还有很多东西没有从python那边继承过来,所以有时候用 ...
- vi编辑器的使用(2)
1.4 光标移动 vi编辑器中的很多命令都是基于光标当前位置的,因此,如何移动光标定位到所需要的位置是一项十分重要的工作,下面进行详细介绍(如无特别说明,下面所讲的命令都是在普通模式下执行). 1. ...
- HDU2602(01背包)
Bone Collector Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- P-Function
题意: 对于集合 $S = {1, 2, ...., n}$ , 定义函数 $F(x) = y, x, y$ 属于 $S$,对于任何 $x$ 属于 $S$, 有 $F(F...F(x)) = x$, ...