主席树||可持久化线段树+离散化 || 莫队+分块 ||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)]\)处\(- ...
随机推荐
- CentOS7 安装FastDFS分布式文件系统
CentOS7 安装FastDFS分布式文件系统 最近要用到fastDFS,所以自己研究了一下,在搭建FastDFS的过程中遇到过很多的问题,为了能帮忙到以后搭建FastDFS的同学,少走弯路,与大家 ...
- LIBTUX_CAT:466: ERROR: tpopen TPERMERR xa_open returned XAER_INVAL
tmboot 启动Tuxedo服务失败,从ULOG日志中看到以下错误: 100534.MATHXH!TMS_ORA10G.22600.4076.0: LIBTUX_CAT:466: ERROR: tp ...
- mongodb 复杂查询之 本表 join
mongdb 的数据介绍: 系统有多个用户,contractId 代表用户Id,其中 serialno 也是一种 id,代表该客户登录系统的编号,该 contractId 每次登录系统都会产生不同 ...
- Python之练习数学运用代码
1.对数函数 import math import matplotlib.pyplot as plt import numpy as np if __name__ == '__main__': x = ...
- Fluent动网格【9】:区域运动
本文所述的区域运动并非动网格中的运动域,而是指在多参考系(MRF)或滑移网格中所涉及到的区域的运动. 在滑移网格中指定区域运动时,除了能够指定绝对运动外,还能指定某一区域与其他区域间的相对运动,如图所 ...
- 分布式任务&分布式锁
目前系统中存在批量审批.批量授权等各个操作,批量操作中可能因为处理机器.线程不同,造成刷新缓存丢失授权等信息,如批量审批同一用户权限多个权限申请后,流程平台并发的发送多个http请求到acl不同服务器 ...
- 把去世的亲友做成聊天机器人,就能让生者慰藉、死者安息吗? - 看了 寻梦历险记,我的回答是 :是的,他/她永远活在我们心里 www.iremember.com.cn
AppU 如今的我们,之所以离不开手机和互联网,是因为它们确实可以带来信息和方便,让我们轻松记录并分享自己的生活体验,留下了充满回忆的各种文字.语音,各种图片.视频…… 但你有没有想过,当我们逝世时, ...
- IntelJ idea下lombok 不生效的问题(@Builder等注解不生效的问题)解决,lombok Plugin插件安装
插件安装方式,在设置setting 中找到plugins.在检索框中检索lom,没有的话点击红框内的search in repositories. 点击install进行安装. 记得安装好了重启ide ...
- HAWQ配置之HDFS HA
一.在ambari管理界面启用HDFS HA 在ambari中这步很简单,在所有安装的服务都正常之后,在HDFS的服务界面中,点击下拉菜单“Actions”,选择启用HDFS HA项 “Enable ...
- MySQL 全文检索 ngram插件
InnoDB全文索引:N-gram Parser[转] MySql5.7 建立全文索引 InnoDB默认的全文索引parser非常合适于Latin,因为Latin是通过空格来分词的.但对于像中文,日文 ...