1901: Zju2112 Dynamic Rankings

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 5268  Solved: 2207
[Submit][Status][Discuss]

Description

给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]……a[j]中第k小的数是多少(1≤k≤j-i+1),并且,你可以改变一些a[i]的值,改变后,程序还能针对改变后的a继续回答上面的问题。你需要编一个这样的程序,从输入文件中读入序列a,然后读入一系列的指令,包括询问指令和修改指令。对于每一个询问指令,你必须输出正确的回答。 第一行有两个正整数n(1≤n≤10000),m(1≤m≤10000)。分别表示序列的长度和指令的个数。第二行有n个数,表示a[1],a[2]……a[n],这些数都小于10^9。接下来的m行描述每条指令,每行的格式是下面两种格式中的一种。 Q i j k 或者 C i t Q i j k (i,j,k是数字,1≤i≤j≤n, 1≤k≤j-i+1)表示询问指令,询问a[i],a[i+1]……a[j]中第k小的数。C i t (1≤i≤n,0≤t≤10^9)表示把a[i]改变成为t。

Input

对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。

Output

 

Sample Input

5 3
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3

Sample Output

3
6

HINT

20%的数据中,m,n≤100; 40%的数据中,m,n≤1000; 100%的数据中,m,n≤10000。

Source

题解:人生中的一个A掉的树套树,就是线段树套Treap树,线段树每一个点所代表的不再是一个简单的点,而是一棵Treap树,然后每次修改将要牵扯到logN棵树,然后每棵树复杂度为logN,所以修改操作是log^2N的,然后就是区间第K大了,显然,查询区间内某数排名在上面的基础上并不难做(其实就是查询有多少个数字小于它然后再+1),然后就是确定最大最小值然后二分一下,这样一来复杂度为log^3N,然后然后没别的了(Hansbug:此程序里面的删除操作和求区间第K大操作是按照hzwer神犇的写法来写的orz)

  1. /**************************************************************
  2. Problem:
  3. User: HansBug
  4. Language: Pascal
  5. Result: Accepted
  6. Time: ms
  7. Memory: kb
  8. ****************************************************************/
  9.  
  10. var
  11. i,j,k,l,m,n,tot:longint;ch:char;
  12. a,b,c,d,e,lef,rig,fix:array[..] of longint;
  13. function max(x,y:longint):longint;
  14. begin
  15. if x>y then max:=x else max:=Y;
  16. end;
  17. function min(x,y:longint):longint;
  18. begin
  19. if x<y then min:=x else min:=y;
  20. end;
  21. procedure swap(var x,y:longint);
  22. var z:longint;
  23. begin
  24. z:=x;x:=y;y:=z;
  25. end;
  26. function newp(x:longint):longint;
  27. begin
  28. inc(tot);newp:=tot;
  29. c[tot]:=x;b[tot]:=;
  30. lef[tot]:=;rig[tot]:=;
  31. fix[tot]:=random(maxlongint);
  32. end;
  33. procedure rt(var x:longint);
  34. var f,l:longint;
  35. begin
  36. if (x=) or (lef[x]=) then exit;
  37. b[lef[x]]:=b[x];b[x]:=b[rig[x]]+b[rig[lef[x]]]+;
  38. f:=x;l:=lef[x];
  39. lef[f]:=rig[l];
  40. rig[l]:=f;
  41. x:=l;
  42. end;
  43. procedure lt(var x:longint);
  44. var f,r:longint;
  45. begin
  46. if (x=) or (rig[x]=) then exit;
  47. b[rig[x]]:=b[x];b[x]:=b[lef[x]]+b[lef[rig[x]]]+;
  48. f:=x;r:=rig[x];
  49. rig[f]:=lef[r];
  50. lef[r]:=f;
  51. x:=r;
  52. end;
  53. procedure ins(var x:longint;y:longint);
  54. begin
  55. if x= then
  56. begin
  57. x:=newp(y);
  58. exit;
  59. end;
  60. if y<c[x] then
  61. begin
  62. ins(lef[x],y);
  63. b[x]:=b[lef[x]]+b[rig[x]]+;
  64. if fix[lef[x]]<fix[x] then rt(x);
  65. end
  66. else
  67. begin
  68. ins(rig[x],y);
  69. b[x]:=b[lef[x]]+b[rig[x]]+;
  70. if fix[rig[x]]<fix[x] then lt(x);
  71. end;
  72. end;
  73. procedure del(var x:longint;y:longint);
  74. begin
  75. if x= then exit;
  76. if c[x]=y then
  77. begin
  78. if lef[x]= then x:=rig[x] else
  79. if rig[x]= then x:=lef[x] else
  80. if fix[lef[x]]>fix[rig[x]] then
  81. begin
  82. lt(x);
  83. del(lef[x],y);
  84. b[x]:=b[lef[x]]+b[rig[x]]+;
  85. end
  86. else begin
  87. rt(x);
  88. del(rig[x],y);
  89. b[x]:=b[lef[x]]+b[rig[x]]+;
  90. end;
  91. end
  92. else if y<c[x] then
  93. begin
  94. del(lef[x],y);
  95. b[x]:=b[lef[x]]+b[rig[x]]+;
  96. end
  97. else begin
  98. del(rig[x],y);
  99. b[x]:=b[rig[x]]+b[lef[x]]+;
  100. end;
  101. end;
  102. function grank(x,y:longint):longint;
  103. begin
  104. if x= then exit();
  105. if c[x]>=y then exit(grank(lef[x],y)) else exit(b[lef[x]]++grank(rig[x],y));
  106. end;
  107. function gmin(x:longint):longint;
  108. begin
  109. if x= then exit(maxlongint);
  110. while lef[x]<> do x:=lef[x];
  111. exit(c[x]);
  112. end;
  113. function gmax(x:longint):longint;
  114. begin
  115. if x= then exit(-maxlongint);
  116. while rig[x]<> do x:=rig[x];
  117. exit(c[x]);
  118. end;
  119. function getrank(z,x,y,l,r,t:longint):longint;
  120. begin
  121. if l>r then exit();
  122. if (x=l) and (y=r) then exit(grank(a[z],t));
  123. exit(getrank(z*,x,(x+y) div ,l,min(r,(x+y) div ),t)+
  124. getrank(z*+,(x+y) div +,y,max((x+y) div +,l),r,t));
  125. end;
  126. function getmin(z,x,y,l,r:longint):longint;
  127. begin
  128. if l>r then exit(maxlongint);
  129. if (x=l) and (y=r) then exit(gmin(a[z]));
  130. exit(min(getmin(z*,x,(x+y) div ,l,min(r,(x+y) div )),
  131. getmin(z*+,(x+y) div +,y,max((x+y) div +,l),r)));
  132. end;
  133. function getmax(z,x,y,l,r:longint):longint;
  134. begin
  135. if l>r then exit(-maxlongint);
  136. if (x=l) and (y=r) then exit(gmax(a[z]));
  137. exit(max(getmax(z*,x,(x+y) div ,l,min(r,(x+y) div )),
  138. getmax(z*+,(x+y) div +,y,max((x+y) div +,l),r)));
  139. end;
  140. function rankget(x,y,z:longint):longint;
  141. var l,r,m:longint;
  142. begin
  143. l:=getmin(,,n,x,y);
  144. r:=getmax(,,n,x,y);
  145. while l<=r do
  146. begin
  147. m:=(l+r) div ;
  148. if getrank(,,n,x,y,m)<=(z-) then
  149. begin
  150. l:=m+;
  151. rankget:=m;
  152. end
  153. else r:=m-;
  154. end;
  155. end;
  156. procedure built(z,x,y:longint);
  157. begin
  158. if x=y then d[x]:=z else
  159. begin
  160. built(z*,x,(x+y) div );
  161. built(z*+,(x+y) div +,y);
  162. end;
  163. a[z]:=;
  164. end;
  165. procedure putin(x,y:longint);
  166. begin
  167. x:=d[x];
  168. while x> do
  169. begin
  170. ins(a[x],y);
  171. x:=x div ;
  172. end;
  173. end;
  174. procedure change(x,y:longint);
  175. var z:longint;
  176. begin
  177. x:=d[x];
  178. z:=c[a[x]];
  179. while x> do
  180. begin
  181. del(a[x],z);
  182. ins(a[x],y);
  183. x:=x div ;
  184. end;
  185. end;
  186. begin
  187. readln(n,m);
  188. built(,,n);
  189. for i:= to n do
  190. begin
  191. read(j);
  192. putin(i,j);
  193. end;
  194. readln;
  195. for i:= to m do
  196. begin
  197. read(ch);
  198. case upcase(ch) of
  199. 'Q':begin
  200. readln(j,k,l);
  201. writeln(rankget(j,k,l));
  202. end;
  203. 'C':begin
  204. readln(j,k);
  205. change(j,k);
  206. end;
  207. end;
  208.  
  209. end;
  210. end.
 

1901: Zju2112 Dynamic Rankings的更多相关文章

  1. BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7143  Solved: 2968[Su ...

  2. Bzoj 1901: Zju2112 Dynamic Rankings 树套树,线段树,平衡树,Treap

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6471  Solved: 2697[Su ...

  3. Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 6321  Solved: 2628[Su ...

  4. BZOJ 1901: Zju2112 Dynamic Rankings( 树状数组套主席树 )

    裸的带修改主席树.. 之前用BIT套Splay( http://www.cnblogs.com/JSZX11556/p/4625552.html )A过..但是还是线段树好写...而且快(常数比平衡树 ...

  5. BZOJ 1901: Zju2112 Dynamic Rankings( BIT 套 BST )

    BIT 套 splay 其实也是不难...每个 BIT 的结点保存一颗 splay , 询问就二分答案然后判断rank... ------------------------------------- ...

  6. bzoj 1901: Zju2112 Dynamic Rankings(树套树)

    1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...

  7. BZOJ 1901 Zju2112 Dynamic Rankings

    树阵主席设置树.维护间隔动态K大. .. ZOJ到空间太小,太大,仅仅能到BZOJ上交 1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memor ...

  8. bzoj 1901: Zju2112 Dynamic Rankings -- 主席树,树状数组,哈希

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec  Memory Limit: 128 MB Description 给定一个含有n个数的序列a[1] ...

  9. 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...

随机推荐

  1. 大型网站制作前端使用PHP后台逻辑用 Java

    对于网站团队,大概可以按照职责分为前端.后端.架构三种角色. 前端:负责所有和用户有交互的产品,包括 WEB以及手机客户端 后端:负责各种业务 API 的开发,以及服务器端其他系统的开发 架构:负责设 ...

  2. HTTP协议系列(3)---包括WebSocket简单介绍

    一.HTTPS     HTTP是超文本传输协议,那HTTPS是什么尼?要明白HTTPS是什么先要明白HTTP的缺点,想一下我们在使用HTTP的时候会有那些缺点尼? 1.通信使用的明文(不加密),内容 ...

  3. 蓝桥网试题 java 基础练习 特殊回文数

    ------------------------------------------------------------------------------------- 简单点,对话的方式简单点 有 ...

  4. ubuntu下安装pdo和pdo_mysql扩展

    ubuntu下安装好LAMP后默认情况没有安装mysql_pdo扩展,以下是安装步聚 1 安装pdo sudo pecl install pdo 出现以下错误是说明pdo已经加入了php的默认安装,不 ...

  5. 读书笔记 effective c++ Item 2 尽量使用const,枚举(enums),内联(inlines),不要使用宏定义(define)

    这个条目叫做,尽量使用编译器而不要使用预处理器更好.#define并没有当作语言本身的一部分. 例如下面的例子: #define ASPECT_RATIO 1.653 符号名称永远不会被编译器看到.它 ...

  6. SwingBench---ORACLE压力测试工具

    SwingBench---ORACLE压力测试工具 ◆描述SwingBench是Oracle UK的一个员工在一个被抛弃的项目的基础上开发的.目前稳定版本2.5,基于JDK.该工具是免费的,可以在作者 ...

  7. Swift2.0 UITextView 和 UITextFile 的使用

    在Swift2.0中,UITextFile 和 UITextView 的使用总体上和在OC中是一样的,今天只是给大家一段代码,然后说UITextView里面的光标位置的问题.先看他们使用的简单的代码 ...

  8. Jenkins在windows上的安装配置

     今天是2月14号,所谓西方情人节,下班回来发现,2月14过的比七夕还火热.于是上网百度百科查询了"情人节". 毕竟是中国的百度啊.是这么解释的.我感到很欣慰.过得每一个节日都应该 ...

  9. matlab 全局变量的使用举例

    昨天在写项目时,想要把获取到的临时变量放入一个全局变量,为以后的使用做准备,结果总是出错,今天做了一个小程序,放在这里备用. 自定义函数: global_p.m function y=global_p ...

  10. MySQL架构由小变大的演变过程

    假设一个网站(discuz)从最开始访问量很小做到日pv千万,我们来推测一下它的mysql服务器架构演变过程. 第一阶段网站访问量日pv量级在1w以下.单台机器跑web和db,不需要做架构层调优(比如 ...