zoukankan      html  css  js  c++  java
  • Rmq Problem / mex

    有一个长度为n的数组{a1,a2,…,an}。m次询问,每次询问一个区间内最小没有出现过的自然数。

    对于100%的数据:1<=n,m<=200000,0<=ai<=10^9,1<=l<=r<=n

    题解

    用主席树维护每个前缀区间中每个数最后出现的位置,查询时如果有某个数出现位置<l那么他就可以选。

    有一些区间问题就是这种思路

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    
    const int maxn=200005;
    const int maxm=7000005;
    const int oo=1000000000;
    int n,m,cnt;
    int root[maxn],ls[maxm],rs[maxm],mi[maxm];
    
    template<class T>inline void read(T &x){
        x=0;int f=0;char ch=getchar();
        while(!isdigit(ch)) {f|=(ch=='-');ch=getchar();}
        while(isdigit(ch)) {x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
        x= f ? -x : x ;
    }
    
    void copy(int x,int y){
        ls[x]=ls[y];
        rs[x]=rs[y];
        mi[x]=mi[y];
    }
    
    void update(int rt){
        mi[rt]=min(mi[ls[rt]],mi[rs[rt]]);
    }
    
    int modify(int rt,int l,int r,int pos,int val){
        int t=++cnt;
        copy(t,rt);
        if(l==r){
            mi[t]=val;
            return t;
        }
        int mid=(l+r)>>1;
        if(pos<=mid) ls[t]=modify(ls[rt],l,mid,pos,val);
        else rs[t]=modify(rs[rt],mid+1,r,pos,val);
        update(t);
        return t;
    }
    
    int query(int rt,int l,int r,int val){
        if(l==r) return l;
        int mid=(l+r)>>1;
        if(mi[ls[rt]]<val) return query(ls[rt],l,mid,val);
        else return query(rs[rt],mid+1,r,val);
    }
    
    int main(){
        read(n);read(m);
        for(int i=1;i<=n;i++) {
            int x;read(x);
            root[i]=modify(root[i-1],0,oo,x,i);
        }
        while(m--){
            int l,r;
            read(l);read(r);
            printf("%d
    ",query(root[r],0,oo,l));
        }
    }
    mex
  • 相关阅读:
    php 条件语句
    MySQL笔记整理任务
    MySQL高可用之PXC
    MySQL高可用之MHA
    虚拟机现有网卡为仅主机模式,需要添加第二块网卡实现上网功能
    Shiro学习
    vue环境搭建
    SpringBoot修改日志的默认配置
    springboot的配置文件application.properties详解
    安装MySQL报错Install/Remove of the Service Denied
  • 原文地址:https://www.cnblogs.com/sto324/p/11627716.html
Copyright © 2011-2022 走看看