题面:Rmq Problem / mex

题解:

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

开头和最尾也要这么插,意义是如果取不了A[i-1]了,最早能取的是啥数。要把这些空白也离散化然后扔主席树里啊。

主席树维护每个数A[i]出现的最晚位置(tree[i].data),查询时查询root[R]的树中最早的data<L的节点(这意味着该节点的下标离散化前代

表的数没有在区间L到R中)。

顺带一提,这道题也可以用莫队套分块做,原理十分好理解,分块维护的是权值,块[i]维护该块是否被填满。我也扔了代码。

另外,我主席树的空间开的其实是不对的,但是bzoj空间比较卡,所以开小点理论上是不对的,但是数据没有那么极端而已。

代码:

主席树||可持久化线段树+离散化版:

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
inline int rd(){
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return f*x;
}
const int maxn=+,maxm=+,inf=<<;
int N,M,cor[maxn<<],lsh_cnt=,root[maxn<<],num_treenode=,L,R;
bool pb[maxn<<];
struct _A{int id,yn,data;}A[maxn];
inline bool cmp(const _A&a,const _A&b){return a.yn<b.yn;}
struct Tree{
int l,r,data,ls,rs;
}t[maxn*];
inline void Build(int x,int l,int r){
t[x].l=l;t[x].r=r;int mid=(l+r)>>;
if(l==r){
if(pb[l])t[x].data=;
return;
}
Build(t[x].ls=++num_treenode,l,mid);
Build(t[x].rs=++num_treenode,mid+,r);
return;
}
inline void Update(int u,int x,int q,int s){
int l=t[u].l,r=t[u].r,mid=(l+r)>>,ls=t[u].ls,rs=t[u].rs;
t[x].l=l;t[x].r=r;
if(l==r&&l==q){t[x].data=s; return;}
if(q<=mid){t[x].rs=rs; Update(ls,t[x].ls=++num_treenode,q,s);}
else{t[x].ls=ls; Update(rs,t[x].rs=++num_treenode,q,s);}
ls=t[x].ls;rs=t[x].rs;
t[x].data=min(t[ls].data,t[rs].data);
return;
}
inline int Query(int x,int s){
int l=t[x].l,r=t[x].r,ls=t[x].ls,rs=t[x].rs;
if(l==r)return l;
if(t[ls].data<s)return Query(ls,s);else return Query(rs,s);
}
inline bool cmp2(const _A&a,const _A&b){return a.id<b.id;}
int main(){
N=rd();M=rd();
for(int i=;i<=N;i++){A[i].yn=rd();A[i].id=i;}
sort(A+,A+N+,cmp);
if(A[].yn!=){
cor[++lsh_cnt]=;
pb[lsh_cnt]=;
}
A[].data=++lsh_cnt;
cor[lsh_cnt]=A[].yn;
for(int i=;i<=N;i++)
if(A[i].yn!=A[i-].yn){
if(A[i].yn!=A[i-].yn+){
cor[++lsh_cnt]=A[i-].yn+;
pb[lsh_cnt]=;
}
A[i].data=++lsh_cnt;
cor[lsh_cnt]=A[i].yn;
}
else A[i].data=lsh_cnt;
cor[++lsh_cnt]=A[N].yn+;
pb[lsh_cnt]=;
Build(root[]=++num_treenode,,lsh_cnt);
sort(A+,A+N+,cmp2);
for(int i=;i<=N;i++)
Update(root[i-],root[i]=++num_treenode,A[i].data,A[i].id);
while(M--){
L=rd();R=rd();
printf("%d\n",cor[Query(root[R],L)]);
}
return ;
}

莫队套分块版:

 #include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
inline int rd(){
int f=,x=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return f*x;
}
const int maxn=,maxm=,max_block=;
int N,M,A[maxn],l,r,block,Ans[maxm],vis[maxn],cnt[max_block],num,belong[maxn];
struct Q{
int id,l,r;
}q[maxm];
inline bool cmp(const Q&a,const Q&b){
if(belong[a.l]==belong[b.l])return a.r<b.r;
return a.l<b.l;
}
inline void Add(int x){
if(x<=N){
if(vis[x]==)cnt[belong[x]]++;
vis[x]++;
}
return;
}
inline void Del(int x){
if(x<=N){
vis[x]--;
if(vis[x]==)cnt[belong[x]]--;
}
return;
}
int main(){
N=rd();M=rd();
block=sqrt(N);
num=N/block;
if(N%block)num++;
for(int i=;i<=N;i++){
A[i]=rd();
belong[i]=(i-)/block+;
}
belong[]=;
for(int i=;i<=M;i++){
q[i].id=i;
q[i].l=rd();
q[i].r=rd();
}
sort(q+,q+M+,cmp);
l=;r=;
for(int i=;i<=M;i++){
int ql=q[i].l,qr=q[i].r,id=q[i].id;
while(l<ql)Del(A[l++]);
while(l>ql)Add(A[--l]);
while(r<qr)Add(A[++r]);
while(r>qr)Del(A[r--]);
if(cnt[]==){
Ans[id]=;
continue;
}
int t=-;
for(int j=;j<=num;j++){
if(j!=num&&cnt[j]!=block){
t=j;
break;
}
else if(cnt[j]!=N-(num-)*block) t=j;
}
if(t==-){
Ans[id]=N;
continue;
}
int f=(t-)*block+,toj=t*block;
for(int j=f;j<=toj;j++)
if(vis[j]==){
Ans[id]=j;
break;
}
}
for(int i=;i<=M;i++)printf("%d\n",Ans[i]);
return ;
}

By:AlenaNuna

主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex的更多相关文章

  1. luogu P4137 Rmq Problem / mex(可持久化线段树)

    一开始想的是莫队,然后维护几个bitset,然后瞎搞.脑子里想了想实现,发现并不好写. 还是主席树好写.我们维护一个权值的线段树,记录每一个权值的最后一次出现的位置下标.我们查询的时候要在前\(r\) ...

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

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

  3. [BZOJ 4771]七彩树(可持久化线段树+树上差分)

    [BZOJ 4771]七彩树(可持久化线段树+树上差分) 题面 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i] ...

  4. P4137 Rmq Problem / mex (莫队)

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

  5. 权值线段树&&可持久化线段树&&主席树

    权值线段树 顾名思义,就是以权值为下标建立的线段树. 现在让我们来考虑考虑上面那句话的产生的三个小问题: 1. 如果说权值作为下标了,那这颗线段树里存什么呢? ----- 这颗线段树中, 记录每个值出 ...

  6. 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665

    如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...

  7. 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )

    在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...

  8. BZOJ4771七彩树——可持久化线段树+set+树链的并+LCA

    给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节 点的颜色为c[i].如果c[i]=c[j],那么我们认为点i和点j拥有相同的颜色.定义dept ...

  9. BZOJ.4771.七彩树(可持久化线段树)

    BZOJ 考虑没有深度限制,对整棵子树询问怎么做. 对于同种颜色中DFS序相邻的两个点\(u,v\),在\(dfn[u],dfn[v]\)处分别\(+1\),\(dfn[LCA(u,v)]\)处\(- ...

随机推荐

  1. [Python设计模式] 第17章 程序中的翻译官——适配器模式

    github地址:https://github.com/cheesezh/python_design_patterns 适配器模式 适配器模式,将一个类的接口转换成客户希望的另外一个接口.Adapte ...

  2. ABC卡

    如今在银行,P2P等各种贷款业务机构,普遍使用信用评分,对客户实行打分制,以期对客户有一个优质与否的评判.但是不是所有人都知道信用评分卡还分A,B,C卡三类!所以,如果你只知道ABC是Gary的ABC ...

  3. Java 设计模式专栏

    Java 设计模式之工厂模式学习心得 转:Java 设计模式之单例模式 转:  Java设计模式之建造者模式 转:Java设计模式之代理模式

  4. Cocos Lua的Touch 点击事件添加

    两种方式: -- 触摸开始 local function onTouchBegan(touch, event) return true end -- 触摸结束 local function onTou ...

  5. 【原创 深度学习与TensorFlow 动手实践系列 - 1】第一课:深度学习总体介绍

    最近一直在研究机器学习,看过两本机器学习的书,然后又看到深度学习,对深度学习产生了浓厚的兴趣,希望短时间内可以做到深度学习的入门和实践,因此写一个深度学习系列吧,通过实践来掌握<深度学习> ...

  6. k8s 官方 配置文件使用教程

    官网链接为 https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/#create-a-name ...

  7. 【云计算】IaaS、PaaS和SaaS

    1. SaaS:Software-as-a-Service(软件即服务) 提供给客户的服务是运营商运行在云计算基础设施上的应用程序,用户可以在各种设备上通过客户端界面访问,如浏览器.消费者不需要管理或 ...

  8. dma子系统 dmac

    DMA子是CPU中实现数据传输的一种方式,CPU配置好DMA控制器之后发起数据传输,CPU本身不参与数据传输的动作中去. DMA种类: 分为外设DMA和DMA控制器.其中外设DMA实现的为特定的外设与 ...

  9. Paxos 实现日志复制同步(Basic Paxos)

    Paxos 实现日志复制同步 本篇文章以 John Ousterhout(斯坦福大学教授) 和 Diego Ongaro(斯坦福大学获得博士学位,Raft算法发明人) 在 Youtube 上的讲解视频 ...

  10. ASCII码与unicode字符集

    问题1:为什么需要字符ASCII码.unicode码等等???它们到底有什么作用? 首先要明白一个事实:在计算机中只能用一系列存储着的0和1,当我们把一个字符存放在计算机时,我们是如何表示常用的字符呢 ...