Processing math: 100%

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

题目描述:

求区间  mex 值. 

题解:用主席树维护每个点出现的最靠右的位置.
当我们查询区间 [l,r] 时,只需看一下 [0,n]rt[r] 的线段树下每个点出现的最靠右的位置的最小值是否小于 l
若小于 l ,则一直贪心在线段树上向左走,直到走到叶子节点为止. 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include<bits/stdc++.h>
#define maxn 200001 
using namespace std;
void setIO(string s)
{
    string in=s+".in";
    freopen(in.c_str(),"r",stdin);
}
namespace tr
{
    #define mid ((l+r)>>1)
    #define lson t[x].l
    #define rson t[x].r
    struct Node
    {
        int l,r,minv,val;
    }t[maxn*30];
    int cnt;
    int newnode() { return ++ cnt; }
    void build(int &x,int l,int r)
    {
        x=newnode();
        if(l==r) return;
        build(lson,l,mid), build(rson,mid+1,r);
    }
    int insert(int u,int l,int r,int k,int delta)
    {
        int x=newnode();
        t[x]=t[u];             
        if(l==r)
        {
            t[x].val=t[x].minv=delta;
            return x;
        }   
        if(k<=mid)
        {
            lson=insert(t[u].l, l, mid, k, delta);    
        }
        else
        {
            rson=insert(t[u].r, mid + 1, r, k, delta);  
        }
        t[x].minv=maxn+233;
        if(lson) t[x].minv=min(t[x].minv,t[lson].minv);
        if(rson) t[x].minv=min(t[x].minv,t[rson].minv);                    
        return x;  
    }
    int query(int x,int l,int r,int k)
    {
        if(l==r) return l;
        if(t[lson].minv < k) return query(lson, l, mid, k);
        else return query(rson, mid + 1, r, k);  
    }
};
int n,Q;
int arr[maxn],rt[maxn];  
int main()
{
    int i,j,x,y,l,r; 
    // setIO("input");
    scanf("%d%d",&n,&Q);
    tr::build(rt[0],0,n+1);
    for(i=1;i<=n;++i)
    {
        scanf("%d",&arr[i]);       
        arr[i]=min(arr[i], n + 1);      
        rt[i]=tr::insert(rt[i-1],0,n+1,arr[i],i);
    }
    for(i=1;i<=Q;++i)
    {
        scanf("%d%d",&l,&r);
        printf("%d\n",tr::query(rt[r], 0, n + 1, l)); 
    }
    return 0;
}

  

posted @   EM-LGH  阅读(169)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· DeepSeek火爆全网,官网宕机?本地部署一个随便玩「LLM探索」
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 上周热点回顾(1.20-1.26)
· 【译】.NET 升级助手现在支持升级到集中式包管理
点击右上角即可分享
微信分享提示