bzoj3489: A simple rmq problem (主席树)
//==========================
蒟蒻Macaulish:http://www.cnblogs.com/Macaulish/ 转载要声明!
//==========================
说好的“因为是OJ上的题,就简单点好了。”呢?
一开始看不懂,不会写。
然后跪了一个晚上决定看云的题解&……似乎是主席树套主席树!吓傻,还开了40000000的数组。然后一交tle……
然后p是不可能玩常数的。
找不到其他做法。
然后找到了神牛dwjshift,好心地提供了题解(http://tieba.baidu.com/p/2947256742#47989538012l )之后还好心地提供了代码!简直业界良心!(dwj必拿AU)
一开始写的是主席树套配对堆(因为要个优先队列嘛)然后发现套个配对堆各种问题(就不说了,其实主要还是我太弱,这个里面很恶心。。。。。)
然后就跪了dwj的代码,用treap实现。
关于题解,正题开始:
主席树套主席树的做法详见帖子中吧主的话
然后发现没有那么必要。
主席树套优先队列详见帖子下面。
“给定一个序列,支持两个操作: 1.给区间[l,r]中塞进或去掉一个数 2.查询某个点的值”
然后类似标记永久化。就可以变成单点修改的线段树套优先队列了
(原来主席树也是可以区间修改区间查询?……只要套个标记永久化)
写的时候有个地方傻叉了,就是主席树修改的时候,如果区间被要修改的区间覆盖时就不用改他儿子,这时候注意不要忘记儿子们=旧的点的儿子们,要是一开始新的点的儿子都是旧的点的不就行了,这是个人风格问题!)
- {$inline on}
- const
- maxn=;
- maxm=;
- var
- left,right,size,fix,max2,value:array[..maxm]of longint;
- root,lson,rson,max:array[..maxm]of longint;
- time,last,next,num:array[..maxn]of longint;
- n,m,tot1,tot2,ll,rr:longint;
- flag:boolean;
- procedure swap(var x,y:longint);inline;
- var
- i:longint;
- begin
- i:=x;
- x:=y;
- y:=i;
- end;
- function mmax(x,y:longint):longint;inline;
- begin
- if x<y then exit(y);
- exit(x);
- end;
- procedure update(x:longint);inline;
- begin
- max2[x]:=mmax(max2[left[x]],max2[right[x]]);
- if size[x]> then max2[x]:=mmax(max2[x],value[x]);
- end;
- procedure leftr(var x:longint);inline;
- var
- k:longint;
- begin
- k:=right[x];
- right[x]:=left[k];
- left[k]:=x;
- max2[k]:=max2[x];
- update(x);
- x:=k;
- end;
- procedure rightr(var x:longint);inline;
- var
- k:longint;
- begin
- k:=left[x];
- left[x]:=right[k];
- right[k]:=x;
- max2[k]:=max2[x];
- update(x);
- x:=k;
- end;
- procedure insert(var x:longint;y:longint);inline;
- begin
- if x= then begin
- inc(tot2);
- x:=tot2;
- size[x]:=;
- value[x]:=y;
- fix[x]:=random(maxn);
- max2[x]:=y;
- left[x]:=;
- right[x]:=;
- exit;
- end;
- if value[x]=y then begin
- if flag then inc(size[x])
- else dec(size[x]);
- update(x);
- end
- else
- if value[x]<y then begin
- insert(right[x],y);
- update(x);
- if fix[right[x]]>fix[x] then leftr(x);
- end
- else begin
- insert(left[x],y);
- update(x);
- if fix[left[x]]>fix[x] then rightr(x);
- end;
- end;
- procedure change(x,old,l,r,y:longint;var new:longint);inline;
- var
- mid:longint;
- begin
- inc(tot1);
- new:=tot1;
- if (ll<=l) and (r<=rr) then begin
- insert(root[x],y);
- max[new]:=max2[root[x]];
- lson[new]:=lson[old];
- rson[new]:=rson[old];
- exit;
- end;
- max[new]:=max2[root[x]];
- mid:=(l+r)>>;
- if ll>mid then begin
- change(x<<+,rson[old],mid+,r,y,rson[new]);
- lson[new]:=lson[old];
- end
- else
- if rr<=mid then begin
- change(x<<,lson[old],l,mid,y,lson[new]);
- rson[new]:=rson[old];
- end
- else begin
- change(x<<,lson[old],l,mid,y,lson[new]);
- change(x<<+,rson[old],mid+,r,y,rson[new]);
- end;
- end;
- function query(x,l,r,y:longint):longint;inline;
- var
- mid:longint;
- begin
- //writeln(x);
- if l=r then exit(max[x]);
- mid:=(l+r)>>;
- if y>mid then exit(mmax(max[x],query(rson[x],mid+,r,y)))
- else exit(mmax(max[x],query(lson[x],l,mid,y)))
- end;
- procedure into;inline;
- var
- i,j:longint;
- begin
- readln(n,m);
- for i:= to n do read(num[i]);
- for i:= to n do last[i]:=n+;
- for i:=n downto do begin
- next[i]:=last[num[i]];
- last[num[i]]:=i;
- end;
- for i:= to n do
- if last[i]<>n+ then begin
- ll:=last[i];
- rr:=next[ll]-;
- flag:=true;
- change(,time[],,n,i,time[]);
- end;
- for i:= to n do begin
- ll:=i-;
- rr:=next[i-]-;
- flag:=false;
- change(,time[i-],,n,num[i-],time[i]);
- if next[i-]<>n+ then begin
- ll:=next[i-];
- rr:=next[ll]-;
- flag:=true;
- change(,time[i],,n,num[i-],time[i]);
- end;
- end;
- end;
- procedure work;inline;
- var
- lastans,l,r:longint;
- begin
- lastans:=;
- while m> do begin
- // writeln(m,'===========');
- dec(m);
- readln(l,r);
- l:=(l+lastans) mod n+;
- r:=(r+lastans) mod n+;
- if l>r then swap(l,r);
- lastans:=query(time[l],,n,r);
- writeln(lastans);
- end;
- end;
- begin
- randomize;
- into;
- work;
- end.
bzoj3489: A simple rmq problem (主席树)的更多相关文章
- 【题解】BZOJ3489 A Hard RMQ problem(主席树套主席树)
[题解]A simple RMQ problem 占坑,免得咕咕咕了,争取在2h内写出代码 upd:由于博主太菜而且硬是要用指针写两个主席树,所以延后2hQAQ upd:由于博主太菜而且太懒所以他决定 ...
- bzoj 3489 A simple rmq problem——主席树套线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题解:http://www.itdaan.com/blog/2017/11/24/9b ...
- BZOJ.3489.A simple rmq problem(主席树 Heap)
题目链接 当时没用markdown写,可能看起来比较难受...可以复制到别的地方看比如DevC++. \(Description\) 给定一个长为n的序列,多次询问[l,r]中最大的只出现一次的数.强 ...
- bzoj 3489 A simple rmq problem —— 主席树套线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3489 题解:http://www.itdaan.com/blog/2017/11/24/9b ...
- BZOJ3489 A simple rmq problem 【可持久化树套树】*
BZOJ3489 A simple rmq problem Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一 ...
- bzoj 3489: A simple rmq problem k-d树思想大暴力
3489: A simple rmq problem Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 551 Solved: 170[Submit][ ...
- bzoj3489 A simple rmq problem 可持久化树套树
先预处理出两个个数组pre,next.pre[i]表示上一个与i位置数字相同的位置,若不存在则设为0:next[i]表示下一个与i位置数字相同的位置,若不存在则设为n+1.那么一个满足在区间[L,R] ...
- 【bzoj3489】 A simple rmq problem k-d树
由于某些原因,我先打了一个错误的树套树,后来打起了$k-d$.接着因不明原因在思路上被卡了很久,在今天中午蹲坑时恍然大悟...... 对于一个数字$a_i$,我们可以用一组三维坐标$(i,pre,nx ...
- bzoj 3489 A simple rmq problem - 线段树
Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直 ...
随机推荐
- Android 打印log 在logcat 看不到
今天调试一个问题,因为是插件,只能通过打印log 定位问题. 但是打印了log 一直没有看到. 代码如下: Log.d("","aaaa24"); 后来发现是需 ...
- 四、新时间日期API
一.使用 LocalDate .LocalTime .LocalDateTime LocalDate.LocalTime.LocalDateTime 类的实例是不可变的对象,分别表示使用 ISO-86 ...
- mysql中的直方图采样逻辑
int handler::sample_next(uchar *buf) { // Temporary set inited to RND, since we are calling rnd_next ...
- Python 多线程、进程、协程上手体验
浅谈 Python 多线程.进程.协程上手体验 前言:浅谈 Python 很多人都认为 Python 的多线程是垃圾(GIL 说这锅甩不掉啊~):本章节主要给你体验下 Python 的两个库 Thre ...
- 第四模块:网络编程进阶&数据库开发 第1章·网络编程进阶
01-进程与程序的概念 02-操作系统介绍 03-操作系统发展历史-第一代计算机 04-操作系统发展历史-批处理系统 05-操作系统发展历史-多道技术 06-操作系统发展历史-分时操作系统 07-总结 ...
- Unity与服务区交互数据
Unity与服务区交互数据 Unity可能在用的时候使用到登陆等需要与服务器交互数据.今天尝试使用了WWW类和WWWForm类来实现Get请求与Post请求. 1.WWW Unity圣典解释: WWW ...
- Unity制作人物头像小图标和小地图
人物头像的制作: 在场景中添加人物模型和环境模型 设置人物的layer为Player 在主摄像机的基础上,新建一个次摄像机并将摄像机镜头对准人物面部,调整至合适大小. 设置次摄像机 culling m ...
- HADOOP/HDFS Essay
HDFS架构 the core of HADOOP/distributed systems is storeage(HDFS) and resource manager(YARN) for compu ...
- 创建https证书
第一个里程碑:创建https证书 创建文件认证目录 mkdir /application/nginx/key/ -p 在认证目录下创建认证文件 openssl req -new -x509 -node ...
- HDU 1569 方格取数(2)(最大流最小割の最大权独立集)
Description 给你一个m*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大. ...