题目链接

当时没用markdown写,可能看起来比较难受...可以复制到别的地方看比如DevC++


\(Description\)

给定一个长为n的序列,多次询问[l,r]中最大的只出现一次的数。强制在线。

\(Solution\)

我也不知道该怎么说,反正就是预处理 建主席树,套堆/set,树i存l为i,r为[i,n]的答案(这样就是在某棵树上单点查maxv了)。
处理好最初的树,就可以利用主席树根据前缀建树的性质,每个点i的建树只需要处理i位置。
那么最初的树就是将所有的数在区间[第一次出现位置,nxt[]-1]中加入这个数。
当左端点i移动时,A[i-1]的贡献没了,要删掉;但是如果A[i-1]在后面出现,则还要在[nxt[A[i-1]],nxt[nxt[A[i-1]]]-1]上加入A[i-1]。(A[i]已经处理了,要么在建最初树时要么在先前建的树中)
也不是每棵树每个节点都套堆,堆只需要帮助建主席树时加加删删(还是利用前缀),要用的只是根据堆得到的每个节点的maxv[],所以堆还是4n大就可以。。

和CF那题不同的是这题固定l更方便,那题固定r好些。所以只需要nxt(和最靠前的一个las用来建最初的树)。

第一次主席树区间修改。。在信息覆盖当前区间时直接给节点赋值,return;查询单点时加上沿路节点的mx[](标记永久化)。
注意新建节点时copy x的mx[]。因为每次删除是完全删除上一次的加入,so在未递归到完全覆盖区间前copy mx是对的?真这样麻烦吗。。以后是不是该乖乖写Update()。。


询问的限制条件可以看成三个维度,即在某三维空间内找权值最大的点,可以用K-D Tree。出题人说这不应是正解,可以卡,只是数据问题跑的比主席树快。。可以看这儿。
不过还是K-D Tree更好的应用吧,不想看了,先放着。。
K-D Tree:https://blog.csdn.net/FromATP/article/details/61198101


代码参考(chao)自:https://blog.csdn.net/u014609452/article/details/51396271。


非强制在线可以直接线段树+排序扫描线做,有个简化版的题见这儿。


//147544kb  9488ms
#include <queue>
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
const int N=1e5+5;int n,Q,A[N],las[N],nxt[N],rcnt,root[N*3],pos[N];
char IN[MAXIN],*SS=IN,*TT=IN;
struct Tree//Persistent Segment Tree
{#define S N*100//我也不知道这样搞区间修改的主席树会有多少节点(2个log?) #define lson son[x][0]#define rson son[x][1]#define ToL l,m,rt<<1#define ToR m+1,r,rt<<1|1struct Heap{std::priority_queue<int> h,d;inline void Insert(int x) {h.push(x);}inline void Delete(int x) {d.push(x);}inline void Maintain(){while(!h.empty()&&!d.empty()&&h.top()==d.top()) h.pop(),d.pop();}inline int Top(){Maintain(); return h.empty()?0:h.top();}}hp[N<<2];int tot,son[S][2],mx[S];//  inline void Update(int x){//Update没啥用啊 又不用区间信息
//      mx[x]=std::max(mx[lson],mx[rson]);
//  }void Insert(int &y,int x,int l,int r,int rt,int L,int R,int v)//rt:一般线段树的节点 存储堆 {y=++tot;if(L<=l && r<=R){hp[rt].Insert(v), mx[y]=hp[rt].Top(), son[y][0]=lson, son[y][1]=rson;return ;}int m=l+r>>1; mx[y]=mx[x];//!if(L<=m)if(m<R) Insert(son[y][0],lson,ToL,L,R,v), Insert(son[y][1],rson,ToR,L,R,v);else son[y][1]=rson, Insert(son[y][0],lson,ToL,L,R,v);else son[y][0]=lson, Insert(son[y][1],rson,ToR,L,R,v);}void Delete(int &y,int x,int l,int r,int rt,int L,int R,int v){y=++tot;if(L<=l && r<=R){hp[rt].Delete(v), mx[y]=hp[rt].Top(), son[y][0]=lson, son[y][1]=rson;return;}int m=l+r>>1; mx[y]=mx[x];//!if(L<=m)if(m<R) Delete(son[y][0],lson,ToL,L,R,v), Delete(son[y][1],rson,ToR,L,R,v);else son[y][1]=rson, Delete(son[y][0],lson,ToL,L,R,v);else son[y][0]=lson, Delete(son[y][1],rson,ToR,L,R,v);}int Query(int x,int l,int r,int pos){if(!x) return 0;//这个没啥用啊...if(l==r) return mx[x];int m=l+r>>1;if(pos<=m) return std::max(mx[x],Query(lson,l,m,pos));else return std::max(mx[x],Query(rson,m+1,r,pos));}
}T;inline int read()
{int now=0;register char c=gc();for(;!isdigit(c);c=gc());for(;isdigit(c);now=now*10+c-'0',c=gc());return now;
}int main()
{n=read(), Q=read();for(int i=1; i<=n; ++i) A[i]=read();for(int i=1; i<=n; ++i) las[i]=n+1;for(int i=n; i; --i) nxt[i]=las[A[i]], las[A[i]]=i;for(int i=n; i; --i)//直接枚举值域建树就可以啊 话说倒着插入堆会更快吗 if(las[i]<=n) T.Insert(root[rcnt],root[rcnt++],1,n,1,las[i],nxt[las[i]]-1,i);//参数顺序 pos[1]=root[rcnt];//root[rcnt] not rcnt→_→for(int i=1; i<n; ++i){T.Delete(root[rcnt],root[rcnt++],1,n,1,i,nxt[i]-1,A[i]);if(nxt[i]<=n)T.Insert(root[rcnt],root[rcnt++],1,n,1,nxt[i],nxt[nxt[i]]-1,A[i]);pos[i+1]=root[rcnt];}for(int ans=0,i=1,l,r; i<=Q; ++i){l=(read()+ans)%n+1, r=(read()+ans)%n+1;if(l>r) std::swap(l,r);//l>r&&(std::swap(l,r),1);printf("%d\n",ans=T.Query(pos[l],1,n,r));}return 0;
}

转载于:https://www.cnblogs.com/SovietPower/p/9247290.html

BZOJ.3489.A simple rmq problem(主席树 Heap)相关推荐

  1. bzoj 3489 A simple rmq problem——主席树套线段树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题解:http://www.itdaan.com/blog/2017/11/24/9b ...

  2. BZOJ 3489: A simple rmq problem

    3489: A simple rmq problem Time Limit: 40 Sec  Memory Limit: 600 MB Submit: 1594  Solved: 520 [Submi ...

  3. BZOJ 3489: A simple rmq problem(K-D Tree)

    Time Limit: 40 Sec  Memory Limit: 512 MB Submit: 2579  Solved: 888 [Submit][Status][Discuss] Descrip ...

  4. 【BZOJ3489】A simple rmq problem(树套树)

    链接w:http://www.lydsy.com/JudgeOnline/problem.php?id=3489 题解:http://blog.csdn.net/PoPoQQQ/article/det ...

  5. BZOJ3489 A simple rmq problem 【可持久化树套树】*

    BZOJ3489 A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一 ...

  6. BZOJ 3218 UOJ #77 A+B Problem (主席树、最小割)

    BZOJ 3218 UOJ #77 A+B Problem (主席树.最小割) 大名鼎鼎的A+B Problem, 主席树优化最小割-- 调题死活调不对,一怒之下改了一种写法交上去A了,但是改写法之后 ...

  7. 【BZOJ3489】A simple rmq problem kd-tree

    [BZOJ3489]A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过 ...

  8. 19.CF803G Periodic RMQ Problem 线段树+分块+线段树标记

    19.CF803G Periodic RMQ Problem 线段树+分块+线段树标记 个人Limitの线段树题单题解主目录:Limitの线段树题单 题解目录_HeartFireY的博客-CSDN博客 ...

  9. BZOJ 4826: [Hnoi2017]影魔 单调栈 主席树

    https://www.lydsy.com/JudgeOnline/problem.php?id=4826 年少不知空间贵,相顾mle空流泪. 和上一道主席树求的东西差不多,求两种对 1. max(a ...

  10. [bzoj3489]A simple rmq problem

    https://www.zybuluo.com/ysner/note/1298153 题面 给出一个长度为\(n\)的序列,给出\(M\)个询问: 在\([l,r]\)之间找到一个在这个区间里只出现过 ...

最新文章

  1. Predicate 在根据多个条件过滤数据的例子
  2. 平台战初现 产品从单个智能走向互联
  3. mysql 查询设置调优_MySQl 查询性能优化相关
  4. 基本的MySQL操作
  5. 从数据仓库到大数据,数据平台这25年是怎样进化的?
  6. javascript 中的 call
  7. ICCV 2019 | 华科提出对称限制的校正网络,显著改进场景文本识别
  8. C++实现二叉树的非递归遍历
  9. mac根目录无法新建文件夹
  10. 学海无涯!最全Android面试知识点梳理,系列篇
  11. 计算机考研833大纲,考研833之计算机组成与系统结构提纲
  12. Cesium for UE4 与 3DTiles
  13. php背景四周向中间渐变色,使用CSS巧妙地制作背景色渐变动画实例
  14. 盐城范围内野外钓鱼好去处(不是塘钓哟)
  15. 上市公司广告宣传推广费-含沪深A股主板、中小企业板等(2011-2020年)
  16. OpenJudge 2986 拼点游戏
  17. NXP JN5189 ZigBee 3.0开发环境搭建
  18. Jfrog Artifactory安装及备份恢复搭建
  19. Java套接字程序_java – 通过Web套接字进行应用程序到应用程序的通信
  20. cloudflare免费证书_久违的百度云加速免费版终于支持 HTTPS 了!

热门文章

  1. C++ std::pair<,> 是什么怎么用
  2. 区块容量 以太坊 比特币
  3. Kubernetes 小白学习笔记(27)--kubernetes的运维-Trouble Shooting方法
  4. bootstrap 文字不换行
  5. android java文件_android 项目下文件的作用
  6. 注册网站域名多少钱_浅析网站域名申请注册的四种常见方式
  7. Spring学习(三)Spring 整合MyBatis、声明式事务
  8. list所有元素相加 python_什么是序列,Python序列详解(包括序列类型和常用操作)...
  9. asp定时生成静态HTML的代码
  10. 二十三、Oracle学习笔记:综合案例