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的更多相关文章

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

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

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

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

  3. 洛谷 P4137 Rmq Problem/mex 题解

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

  4. P4137 Rmq Problem / mex (莫队)

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

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

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

  6. P4137 Rmq Problem / mex

    目录 链接 思路 线段树 莫队 链接 https://www.luogu.org/problemnew/show/P4137 思路 做了好几次,每次都得想一会,再记录一下 可持久化权值线段树 区间出现 ...

  7. Luogu P4137 Rmq Problem / mex

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

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

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

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

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

随机推荐

  1. weixin报警脚本

    #!/bin/bash ### script name weixin.sh ### send messages from weixin for zabbix monitor ### jack ### ...

  2. ibatis 优点,未完版

    iBatis是Apache的一个开源项目,一个O/R Mapping(???)解决方案,iBatis最大的特点就是小巧,上手很快,如果不需要太多复杂的功能,ibatis是能满足你得要求又足够灵活的最简 ...

  3. c/c++生成预编译文件

    Preprocesses C and C++ source files and writes the preprocessed output to a file.   /P Remarks The f ...

  4. Markdown Reader 插件改造

    Markdown Reader 是一款比较好用的浏览markdown文件的chrome插件 插件地址:https://chrome.google.com/webstore/detail/markdow ...

  5. 给DataTable中添加一行数据

    一.如果该DataTable有两列,列的名称是Name,Age,且该DataTable的名称是dt; DataRow dr = dt.NewRow(); dr["Name"] = ...

  6. leetcode398 and leetcode 382 蓄水池抽样算法

    382. 链表随机节点 给定一个单链表,随机选择链表的一个节点,并返回相应的节点值.保证每个节点被选的概率一样. 进阶:如果链表十分大且长度未知,如何解决这个问题?你能否使用常数级空间复杂度实现? 示 ...

  7. docker集群管理

    docker集群管理 ps:docker machine     docker swarm       docker compose  在Docker Machine发布之前,你可能会遇到以下问题: ...

  8. 指定网卡进行ping操作

    windows系统下:ping -S  查看当前网卡情况 ipconfig 有两块网卡,ip分别为 192.168.12.83.192.168.1.126 使用不同网卡分别ping百度 网卡1: pi ...

  9. 探究c++默认初始化

    按照c++ primer 5th第40页的描述,如果定义变量时没有指定初值,则变量被默认初始化,此时变量被赋予了“默认值”. 根据变量定义的位置,分为两种情况: 1.定义于任何函数体之外的变量被初始化 ...

  10. 1.1-1.4 sqoop概述及安装cdh版hadoop

    一.概述 Sqoop是一个在结构化数据和Hadoop之间进行批量数据迁移的工具,结构化数据可以是Mysql.Oracle等RDBMS. Sqoop底层用MapReduce程序实现抽取.转换.加载,Ma ...