bzoj 3585: mex
来源:互联网 发布:淘宝分享购物清单在哪 编辑:程序博客网 时间:2024/06/10 22:27
题意:
区间mex。
题解:
绝对的好题,好思路。涨姿势。
有一种莫队+分块的做法较好想,但复杂度有点炸,对这题还好,别的题大一点就炸了。
orz主席树做法。
还是以位置为根,建权值线段树。
首先定义一个值a在i下的意义,为a在i前出现的最右边的位置。
然后对一段权值区间l r,取最小值。
然后可以类似区间第k大的二分,假如当前这段的
code:
#include<cstdio>#include<cstdlib>#include<iostream>#include<cstring>using namespace std;const int md=1000000000;struct trnode{ int lc,rc,c;}tr[6500010];int tot=0,root[200010];int n,m;void update(int &x,int froot,int l,int r,int k,int c){ x=++tot; tr[x]=tr[froot]; if(l==r){tr[x].c=c;return;} int mid=(l+r)/2; if(k<=mid) update(tr[x].lc,tr[froot].lc,l,mid,k,c); else update(tr[x].rc,tr[froot].rc,mid+1,r,k,c); tr[x].c=min(tr[tr[x].lc].c,tr[tr[x].rc].c);}int findans(int x,int k,int l,int r){ if(l==r) return l; int lc=tr[x].lc,lcc=tr[lc].c,mid=(l+r)/2; if(lcc<k) return findans(tr[x].lc,k,l,mid); else return findans(tr[x].rc,k,mid+1,r);}int main(){ scanf("%d %d",&n,&m); for(int i=1;i<=n;i++) { int x;scanf("%d",&x); update(root[i],root[i-1],0,md,x,i); } for(int i=1;i<=m;i++) { int l,r;scanf("%d %d",&l,&r); printf("%d\n",findans(root[r],l,0,md)); }}
阅读全文
1 0
- bzoj 3585: mex
- bzoj-3585 mex
- [BZOJ 3585]mex
- bzoj 3585: mex
- bzoj 3585: mex
- BZOJ 3585 mex
- 【BZOJ 3585】mex 主席树
- BZOJ 3585 mex 莫队算法+分块
- BZOJ 3585: mex|莫队算法
- BZOJ 3585 mex 莫队算法+分块
- BZOJ 3585 mex 莫队算法+分块
- BZOJ 3585/3339 mex/Rmq Problem 莫队
- BZOJ 3339/3585 Rmq Problem/mex 莫队算法
- mex
- Mex
- mex
- mex
- 【BZOJ】【P3339&P3585】【Rmq Problem/mex】【题解】【离线】
- 编程语言注释快捷键总结
- PAT A1081. Rational Sum
- 普通学渣的春招,秋招历程以及实习心路
- 找出文件中的中文
- NET配置config后支持下载ipa、apk等格式的文件
- bzoj 3585: mex
- QT读写ini配置文件以及绝对路径的使用
- Go语言Channel详解
- JZOJ 5268. 旅行
- JS中的本地存储
- 双创周|9月19日上午新零售主题沙龙:《物联网重构新零售》
- Request is not public in 'okhttp3.Request'.Cannot be accessed from outside package
- cfenglv的一道简单签到题 QDU
- 通达oa破解版下载/通达oa破解版/通达oa2017破解版