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

    思路

    主席树维护mex
    维护一下每个数上次出现的位置
    [l,r]就是在r这颗线段树上查询位置小于l的最小的数

    代码

    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    struct Node{
        int lson,rson,minx;
    }Seg[200200*30];
    int n,m,root[200200],Nodecnt,a[200200];
    void pushup(int o){
        Seg[o].minx=min(Seg[Seg[o].lson].minx,Seg[Seg[o].rson].minx);
    }
    void modi(int l,int r,int &o,int last,int pos,int val){
        Seg[++Nodecnt]=Seg[last];
        o=Nodecnt;
        if(l==r){
            Seg[o].minx=val;
            return;
        }
        int mid=(l+r)>>1;
        if(pos<=mid)
            modi(l,mid,Seg[o].lson,Seg[last].lson,pos,val);
        else
            modi(mid+1,r,Seg[o].rson,Seg[last].rson,pos,val);
        pushup(o);
    }
    int query(int l,int r,int o,int x){
        if(Seg[o].minx>=x)
            return r+1;
        if(l==r)
            return l;
        int mid=(l+r)>>1;
        if(Seg[Seg[o].lson].minx<x)
            return query(l,mid,Seg[o].lson,x);
        else if(Seg[Seg[o].rson].minx<x)
            return query(mid+1,r,Seg[o].rson,x);
    }
    int main(){
        scanf("%d %d",&n,&m);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            if(a[i]>n)
                a[i]=n+1;
            a[i]++;
            modi(1,n+2,root[i],root[i-1],a[i],i);
        }
        for(int i=1;i<=m;i++){
            int l,r;
            scanf("%d %d",&l,&r);
            printf("%d
    ",query(1,n+2,root[r],l)-1);
        }
        return 0;
    } 
    
  • 相关阅读:
    300. Longest Increasing Subsequence_算法有误
    LIS (DP)_代码
    pthread_detach pthread_create实例
    pthread_detach
    DP(动态规划)
    括号匹配(二)
    gdb调试遇到的问题
    matplotlib 显示中文
    一个奇怪的编码 big5-hkscs
    python 重载 __hash__ __eq__
  • 原文地址:https://www.cnblogs.com/dreagonm/p/10807451.html
Copyright © 2011-2022 走看看