//==========================

蒟蒻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.查询某个点的值”

然后类似标记永久化。就可以变成单点修改的线段树套优先队列了

(原来主席树也是可以区间修改区间查询?……只要套个标记永久化)

写的时候有个地方傻叉了,就是主席树修改的时候,如果区间被要修改的区间覆盖时就不用改他儿子,这时候注意不要忘记儿子们=旧的点的儿子们,要是一开始新的点的儿子都是旧的点的不就行了,这是个人风格问题!)

  1. {$inline on}
  2. const
  3. maxn=;
  4. maxm=;
  5.  
  6. var
  7. left,right,size,fix,max2,value:array[..maxm]of longint;
  8. root,lson,rson,max:array[..maxm]of longint;
  9. time,last,next,num:array[..maxn]of longint;
  10. n,m,tot1,tot2,ll,rr:longint;
  11. flag:boolean;
  12.  
  13. procedure swap(var x,y:longint);inline;
  14. var
  15. i:longint;
  16. begin
  17. i:=x;
  18. x:=y;
  19. y:=i;
  20. end;
  21.  
  22. function mmax(x,y:longint):longint;inline;
  23. begin
  24. if x<y then exit(y);
  25. exit(x);
  26. end;
  27.  
  28. procedure update(x:longint);inline;
  29. begin
  30. max2[x]:=mmax(max2[left[x]],max2[right[x]]);
  31. if size[x]> then max2[x]:=mmax(max2[x],value[x]);
  32. end;
  33.  
  34. procedure leftr(var x:longint);inline;
  35. var
  36. k:longint;
  37. begin
  38. k:=right[x];
  39. right[x]:=left[k];
  40. left[k]:=x;
  41. max2[k]:=max2[x];
  42. update(x);
  43. x:=k;
  44. end;
  45.  
  46. procedure rightr(var x:longint);inline;
  47. var
  48. k:longint;
  49. begin
  50. k:=left[x];
  51. left[x]:=right[k];
  52. right[k]:=x;
  53. max2[k]:=max2[x];
  54. update(x);
  55. x:=k;
  56. end;
  57.  
  58. procedure insert(var x:longint;y:longint);inline;
  59. begin
  60. if x= then begin
  61. inc(tot2);
  62. x:=tot2;
  63. size[x]:=;
  64. value[x]:=y;
  65. fix[x]:=random(maxn);
  66. max2[x]:=y;
  67. left[x]:=;
  68. right[x]:=;
  69. exit;
  70. end;
  71. if value[x]=y then begin
  72. if flag then inc(size[x])
  73. else dec(size[x]);
  74. update(x);
  75. end
  76. else
  77. if value[x]<y then begin
  78. insert(right[x],y);
  79. update(x);
  80. if fix[right[x]]>fix[x] then leftr(x);
  81. end
  82. else begin
  83. insert(left[x],y);
  84. update(x);
  85. if fix[left[x]]>fix[x] then rightr(x);
  86. end;
  87. end;
  88.  
  89. procedure change(x,old,l,r,y:longint;var new:longint);inline;
  90. var
  91. mid:longint;
  92. begin
  93. inc(tot1);
  94. new:=tot1;
  95. if (ll<=l) and (r<=rr) then begin
  96. insert(root[x],y);
  97. max[new]:=max2[root[x]];
  98. lson[new]:=lson[old];
  99. rson[new]:=rson[old];
  100. exit;
  101. end;
  102. max[new]:=max2[root[x]];
  103. mid:=(l+r)>>;
  104. if ll>mid then begin
  105. change(x<<+,rson[old],mid+,r,y,rson[new]);
  106. lson[new]:=lson[old];
  107. end
  108. else
  109. if rr<=mid then begin
  110. change(x<<,lson[old],l,mid,y,lson[new]);
  111. rson[new]:=rson[old];
  112. end
  113. else begin
  114. change(x<<,lson[old],l,mid,y,lson[new]);
  115. change(x<<+,rson[old],mid+,r,y,rson[new]);
  116. end;
  117. end;
  118.  
  119. function query(x,l,r,y:longint):longint;inline;
  120. var
  121. mid:longint;
  122. begin
  123. //writeln(x);
  124. if l=r then exit(max[x]);
  125. mid:=(l+r)>>;
  126. if y>mid then exit(mmax(max[x],query(rson[x],mid+,r,y)))
  127. else exit(mmax(max[x],query(lson[x],l,mid,y)))
  128. end;
  129.  
  130. procedure into;inline;
  131. var
  132. i,j:longint;
  133. begin
  134. readln(n,m);
  135. for i:= to n do read(num[i]);
  136. for i:= to n do last[i]:=n+;
  137. for i:=n downto do begin
  138. next[i]:=last[num[i]];
  139. last[num[i]]:=i;
  140. end;
  141. for i:= to n do
  142. if last[i]<>n+ then begin
  143. ll:=last[i];
  144. rr:=next[ll]-;
  145. flag:=true;
  146. change(,time[],,n,i,time[]);
  147. end;
  148. for i:= to n do begin
  149. ll:=i-;
  150. rr:=next[i-]-;
  151. flag:=false;
  152. change(,time[i-],,n,num[i-],time[i]);
  153. if next[i-]<>n+ then begin
  154. ll:=next[i-];
  155. rr:=next[ll]-;
  156. flag:=true;
  157. change(,time[i],,n,num[i-],time[i]);
  158. end;
  159. end;
  160. end;
  161.  
  162. procedure work;inline;
  163. var
  164. lastans,l,r:longint;
  165. begin
  166. lastans:=;
  167. while m> do begin
  168. // writeln(m,'===========');
  169. dec(m);
  170. readln(l,r);
  171. l:=(l+lastans) mod n+;
  172. r:=(r+lastans) mod n+;
  173. if l>r then swap(l,r);
  174. lastans:=query(time[l],,n,r);
  175. writeln(lastans);
  176. end;
  177. end;
  178.  
  179. begin
  180. randomize;
  181. into;
  182. work;
  183. end.

bzoj3489: A simple rmq problem (主席树)的更多相关文章

  1. 【题解】BZOJ3489 A Hard RMQ problem(主席树套主席树)

    [题解]A simple RMQ problem 占坑,免得咕咕咕了,争取在2h内写出代码 upd:由于博主太菜而且硬是要用指针写两个主席树,所以延后2hQAQ upd:由于博主太菜而且太懒所以他决定 ...

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

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

  3. BZOJ.3489.A simple rmq problem(主席树 Heap)

    题目链接 当时没用markdown写,可能看起来比较难受...可以复制到别的地方看比如DevC++. \(Description\) 给定一个长为n的序列,多次询问[l,r]中最大的只出现一次的数.强 ...

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

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

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

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

  6. 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][ ...

  7. bzoj3489 A simple rmq problem 可持久化树套树

    先预处理出两个个数组pre,next.pre[i]表示上一个与i位置数字相同的位置,若不存在则设为0:next[i]表示下一个与i位置数字相同的位置,若不存在则设为n+1.那么一个满足在区间[L,R] ...

  8. 【bzoj3489】 A simple rmq problem k-d树

    由于某些原因,我先打了一个错误的树套树,后来打起了$k-d$.接着因不明原因在思路上被卡了很久,在今天中午蹲坑时恍然大悟...... 对于一个数字$a_i$,我们可以用一组三维坐标$(i,pre,nx ...

  9. bzoj 3489 A simple rmq problem - 线段树

    Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直 ...

随机推荐

  1. SpringBoot入门(一)——开箱即用

    本文来自网易云社区 Spring Boot是什么 从根本上来讲Spring Boot就是一些库的集合,是一个基于"约定优于配置"的原则,快速搭建应用的框架.本质上依然Spring, ...

  2. C语言灵魂--指针

    什么是指针?理解指针之前得知道什么是地址. 1.数据在计算机中的存储形式: 数据在计算机中是以二进制的形式存储的.计算机的存储器是用半导体集成电路构成的,有N多个二极管元件组成. 每一个二极管元件就如 ...

  3. VIN码识别,车架号识别,OCR扫描工具

    近年二手车交易市场火爆,对二手车估值需要了详细解二手车的历史状况,车架号(VIN码)是车辆唯一的身份标识,也是了解二手车车况的入口,车商和二手车平台会频繁的进行车况查询,VIN码扫描识别技术给车辆估值 ...

  4. Linux命令应用大词典-第40章 网络客户端

    40.1 elinks:字符模式的Web浏览器 40.2 wget:从Web网站下载文件 40.3 curl:传输URL 40.4 lynx:通用分布式信息的万维网浏览器 40.5 lftp:实现文件 ...

  5. Python入门编程中的变量、字符串以及数据类型

    //2018.10.10 字符串与变量 1. 在输出语句中如果需要出现单引号或者双引号,可以使用转义符号\,它可以将其中的歧义错误解释化解,使得输出正常: 2. 对于python的任何变量都需要进行赋 ...

  6. EditorGUI控件输入监听

    EditorGUI控件输入监听 在做编辑器开放的过程中,有时候要对用户输入进行判断和限制,但EditorGUI控件却没有触发回调,而是提供了一种麻烦的办法--使用EditorGUI.BeginChan ...

  7. 加油吧 骚年QAQ

    本随笔文章,由个人博客(鸟不拉屎)转移至博客园 写于:2017 年 11 月 08 日 原地址:https://niaobulashi.com/archives/fighting.html --- 想 ...

  8. TW实习日记:第14天

    今天可以说是又忙又不忙了,忙是因为要赶bug,似乎总有种隐形的力量催着你交工,但实际上太多涉及后端接口的问题,所以又要等别人修改接口才能改bug,可以说真是十分蛋疼了. 改bug的最大心得就是:写好注 ...

  9. Java并发基础--ThreadLocal

    一.ThreadLocal定义 ThreadLocal是一个可以提供线程局部变量的类,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路,通过为每个线程提供一个独立的变量副本解决了变量 ...

  10. lintcode172 删除元素

    删除元素   给定一个数组和一个值,在原地删除与值相同的数字,返回新数组的长度. 元素的顺序可以改变,并且对新的数组不会有影响. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一个数组 [0, ...