博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu P4137 Rmq Problem / mex 主席树 + 思维
阅读量:4581 次
发布时间:2019-06-09

本文共 1596 字,大约阅读时间需要 5 分钟。

题目描述:

求区间  $mex$ 值. 

题解:用主席树维护每个点出现的最靠右的位置.
当我们查询区间 $[l,r]$ 时,只需看一下 $[0,n]$ 在 $rt[r]$ 的线段树下每个点出现的最靠右的位置的最小值是否小于 $l$
若小于 $l$ ,则一直贪心在线段树上向左走,直到走到叶子节点为止. 
#include
#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; }

  

转载于:https://www.cnblogs.com/guangheli/p/11075517.html

你可能感兴趣的文章
2018HDU多校训练-3-Problem F. Grab The Tree
查看>>
2016012032四则运算网页版结对项目报告
查看>>
淘宝专业版改基础版方法
查看>>
[转]ARM Pipeline
查看>>
[转]Blocking Code Injection on iOS and OS X
查看>>
颜色分类函数
查看>>
(中等) HDU 4725 The Shortest Path in Nya Graph,Dijkstra+加点。
查看>>
sort-归并排序
查看>>
django 快速实现完整登录系统(cookie)
查看>>
.NET中的out和ref关键字
查看>>
Python之ftp服务器
查看>>
KMP预处理
查看>>
oracle的wm_concat函数实现行转列
查看>>
C语 三子棋小游戏
查看>>
[BZOJ 1861] 书架
查看>>
送给毕业生的一个学习建议
查看>>
基于redis+lua实现高并发场景下的秒杀限流解决方案
查看>>
Oracle 块修改跟踪 (Block Change Tracking) 说明
查看>>
阿里云 Redis 服务遇到的问题
查看>>
Jwt Token 安全策略使用 ECDSA 椭圆曲线加密算法签名/验证
查看>>