主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex
题解:
先离散化,然后插一堆空白,大体就是如果(对于以a.data<b.data排序后的A)A[i-1].data+1!=A[i].data,则插一个空白叫做A[i-1].data+1,
开头和最尾也要这么插,意义是如果取不了A[i-1]了,最早能取的是啥数。要把这些空白也离散化然后扔主席树里啊。
主席树维护每个数A[i]出现的最晚位置(tree[i].data),查询时查询root[R]的树中最早的data<L的节点(这意味着该节点的下标离散化前代
表的数没有在区间L到R中)。
顺带一提,这道题也可以用莫队套分块做,原理十分好理解,分块维护的是权值,块[i]维护该块是否被填满。我也扔了代码。
另外,我主席树的空间开的其实是不对的,但是bzoj空间比较卡,所以开小点理论上是不对的,但是数据没有那么极端而已。
代码:
主席树||可持久化线段树+离散化版:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
inline int rd(){
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return f*x;
}
const int maxn=+,maxm=+,inf=<<;
int N,M,cor[maxn<<],lsh_cnt=,root[maxn<<],num_treenode=,L,R;
bool pb[maxn<<];
struct _A{int id,yn,data;}A[maxn];
inline bool cmp(const _A&a,const _A&b){return a.yn<b.yn;}
struct Tree{
int l,r,data,ls,rs;
}t[maxn*];
inline void Build(int x,int l,int r){
t[x].l=l;t[x].r=r;int mid=(l+r)>>;
if(l==r){
if(pb[l])t[x].data=;
return;
}
Build(t[x].ls=++num_treenode,l,mid);
Build(t[x].rs=++num_treenode,mid+,r);
return;
}
inline void Update(int u,int x,int q,int s){
int l=t[u].l,r=t[u].r,mid=(l+r)>>,ls=t[u].ls,rs=t[u].rs;
t[x].l=l;t[x].r=r;
if(l==r&&l==q){t[x].data=s; return;}
if(q<=mid){t[x].rs=rs; Update(ls,t[x].ls=++num_treenode,q,s);}
else{t[x].ls=ls; Update(rs,t[x].rs=++num_treenode,q,s);}
ls=t[x].ls;rs=t[x].rs;
t[x].data=min(t[ls].data,t[rs].data);
return;
}
inline int Query(int x,int s){
int l=t[x].l,r=t[x].r,ls=t[x].ls,rs=t[x].rs;
if(l==r)return l;
if(t[ls].data<s)return Query(ls,s);else return Query(rs,s);
}
inline bool cmp2(const _A&a,const _A&b){return a.id<b.id;}
int main(){
N=rd();M=rd();
for(int i=;i<=N;i++){A[i].yn=rd();A[i].id=i;}
sort(A+,A+N+,cmp);
if(A[].yn!=){
cor[++lsh_cnt]=;
pb[lsh_cnt]=;
}
A[].data=++lsh_cnt;
cor[lsh_cnt]=A[].yn;
for(int i=;i<=N;i++)
if(A[i].yn!=A[i-].yn){
if(A[i].yn!=A[i-].yn+){
cor[++lsh_cnt]=A[i-].yn+;
pb[lsh_cnt]=;
}
A[i].data=++lsh_cnt;
cor[lsh_cnt]=A[i].yn;
}
else A[i].data=lsh_cnt;
cor[++lsh_cnt]=A[N].yn+;
pb[lsh_cnt]=;
Build(root[]=++num_treenode,,lsh_cnt);
sort(A+,A+N+,cmp2);
for(int i=;i<=N;i++)
Update(root[i-],root[i]=++num_treenode,A[i].data,A[i].id);
while(M--){
L=rd();R=rd();
printf("%d\n",cor[Query(root[R],L)]);
}
return ;
}
莫队套分块版:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
inline int rd(){
int f=,x=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return f*x;
}
const int maxn=,maxm=,max_block=;
int N,M,A[maxn],l,r,block,Ans[maxm],vis[maxn],cnt[max_block],num,belong[maxn];
struct Q{
int id,l,r;
}q[maxm];
inline bool cmp(const Q&a,const Q&b){
if(belong[a.l]==belong[b.l])return a.r<b.r;
return a.l<b.l;
}
inline void Add(int x){
if(x<=N){
if(vis[x]==)cnt[belong[x]]++;
vis[x]++;
}
return;
}
inline void Del(int x){
if(x<=N){
vis[x]--;
if(vis[x]==)cnt[belong[x]]--;
}
return;
}
int main(){
N=rd();M=rd();
block=sqrt(N);
num=N/block;
if(N%block)num++;
for(int i=;i<=N;i++){
A[i]=rd();
belong[i]=(i-)/block+;
}
belong[]=;
for(int i=;i<=M;i++){
q[i].id=i;
q[i].l=rd();
q[i].r=rd();
}
sort(q+,q+M+,cmp);
l=;r=;
for(int i=;i<=M;i++){
int ql=q[i].l,qr=q[i].r,id=q[i].id;
while(l<ql)Del(A[l++]);
while(l>ql)Add(A[--l]);
while(r<qr)Add(A[++r]);
while(r>qr)Del(A[r--]);
if(cnt[]==){
Ans[id]=;
continue;
}
int t=-;
for(int j=;j<=num;j++){
if(j!=num&&cnt[j]!=block){
t=j;
break;
}
else if(cnt[j]!=N-(num-)*block) t=j;
}
if(t==-){
Ans[id]=N;
continue;
}
int f=(t-)*block+,toj=t*block;
for(int j=f;j<=toj;j++)
if(vis[j]==){
Ans[id]=j;
break;
}
}
for(int i=;i<=M;i++)printf("%d\n",Ans[i]);
return ;
}
By:AlenaNuna
主席树||可持久化线段树+离散化 || 莫队+分块 ||BZOJ 3585: mex || Luogu P4137 Rmq Problem / mex的更多相关文章
- luogu P4137 Rmq Problem / mex(可持久化线段树)
一开始想的是莫队,然后维护几个bitset,然后瞎搞.脑子里想了想实现,发现并不好写. 还是主席树好写.我们维护一个权值的线段树,记录每一个权值的最后一次出现的位置下标.我们查询的时候要在前\(r\) ...
- luogu P4137 Rmq Problem / mex 主席树 + 思维
Code: #include<bits/stdc++.h> #define maxn 200001 using namespace std; void setIO(string s) { ...
- [BZOJ 4771]七彩树(可持久化线段树+树上差分)
[BZOJ 4771]七彩树(可持久化线段树+树上差分) 题面 给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节点的颜色为c[i].如果c[i] ...
- P4137 Rmq Problem / mex (莫队)
题目 P4137 Rmq Problem / mex 解析 莫队算法维护mex, 往里添加数的时候,若添加的数等于\(mex\),\(mex\)就不能等于这个值了,就从这个数开始枚举找\(mex\): ...
- 权值线段树&&可持久化线段树&&主席树
权值线段树 顾名思义,就是以权值为下标建立的线段树. 现在让我们来考虑考虑上面那句话的产生的三个小问题: 1. 如果说权值作为下标了,那这颗线段树里存什么呢? ----- 这颗线段树中, 记录每个值出 ...
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- 主席树[可持久化线段树](hdu 2665 Kth number、SP 10628 Count on a tree、ZOJ 2112 Dynamic Rankings、codeforces 813E Army Creation、codeforces960F:Pathwalks )
在今天三黑(恶意评分刷上去的那种)两紫的智推中,突然出现了P3834 [模板]可持久化线段树 1(主席树)就突然有了不详的预感2333 果然...然后我gg了!被大佬虐了! hdu 2665 Kth ...
- BZOJ4771七彩树——可持久化线段树+set+树链的并+LCA
给定一棵n个点的有根树,编号依次为1到n,其中1号点是根节点.每个节点都被染上了某一种颜色,其中第i个节 点的颜色为c[i].如果c[i]=c[j],那么我们认为点i和点j拥有相同的颜色.定义dept ...
- BZOJ.4771.七彩树(可持久化线段树)
BZOJ 考虑没有深度限制,对整棵子树询问怎么做. 对于同种颜色中DFS序相邻的两个点\(u,v\),在\(dfn[u],dfn[v]\)处分别\(+1\),\(dfn[LCA(u,v)]\)处\(- ...
随机推荐
- iframe中video没有全屏按钮
HTML内联框架元素 <iframe> iframe默认不允许全屏, 如果内嵌了video那么控制条上将不显示全屏按钮, 通过添加allowfullscreen属性可以开启全屏功能. mo ...
- (20170207)开源第三方学习之JSONModel
1:仓库地址:https://github.com/jsonmodel/jsonmodel 主要作用是把JSON字符串转成Model实体,也可以把实体转化成JSON字符串:还包含一些转字典的内容: ...
- springcloud如何实现服务的平滑发布
在之前的文章中我们提到服务的优雅下线,见: SpringCloud服务如何在Eureka安全优雅的下线 但这个对于ribbon调用其实是不平滑的,shutdown请求到后服务就马上关闭了,服务消费此时 ...
- NOIP2011普及组 数字反转
题目OJ链接: http://codevs.cn/problem/1130/ https://www.luogu.org/problemnew/show/P1307 2011年NOIP全国联赛普及组 ...
- 解决Linux文件系统变成只读的方法
解决Linux文件系统变成只读的方法 解决方法 1.重启看是否可以修复(很多机器可以) 2.使用用 fsck – y /dev/hdc6 (/dev/hdc6指你需要修复的分区) 来修复文件系统 ...
- 【原创 Hadoop&Spark 动手实践 8】Spark 应用经验、调优与动手实践
[原创 Hadoop&Spark 动手实践 7]Spark 应用经验.调优与动手实践 目标: 1. 了解Spark 应用经验与调优的理论与方法,如果遇到Spark调优的事情,有理论思考框架. ...
- 【OCR技术系列之八】端到端不定长文本识别CRNN代码实现
CRNN是OCR领域非常经典且被广泛使用的识别算法,其理论基础可以参考我上一篇文章,本文将着重讲解CRNN代码实现过程以及识别效果. 数据处理 利用图像处理技术我们手工大批量生成文字图像,一共360万 ...
- [转]decorator(HTML装饰器)
原文地址:https://blog.csdn.net/jzh440/article/details/7770013 1>:每当遇到一个新的技术,首先我会问自己,这个技术是做神马的?用这个技术有神 ...
- python3 log 日志记录
在调试的过程中,很多地方需要用到日志 如下 import logging LOG_FORMAT = "%(asctime)s - %(levelname)s - %(message)s&qu ...
- sql日期格式小应用 记录一下
比如这样的数据 20170317 要转成2017-03-17 单独一步做不到 两步思想 先转成日期格式 在进行格式化 select CONVERT(varchar(10),(CAST(CONVERT( ...