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)

 /**************************************************************
Problem:
User: HansBug
Language: Pascal
Result: Accepted
Time: ms
Memory: kb
****************************************************************/ var
i,j,k,l,m,n,tot:longint;ch:char;
a,b,c,d,e,lef,rig,fix:array[..] of longint;
function max(x,y:longint):longint;
begin
if x>y then max:=x else max:=Y;
end;
function min(x,y:longint):longint;
begin
if x<y then min:=x else min:=y;
end;
procedure swap(var x,y:longint);
var z:longint;
begin
z:=x;x:=y;y:=z;
end;
function newp(x:longint):longint;
begin
inc(tot);newp:=tot;
c[tot]:=x;b[tot]:=;
lef[tot]:=;rig[tot]:=;
fix[tot]:=random(maxlongint);
end;
procedure rt(var x:longint);
var f,l:longint;
begin
if (x=) or (lef[x]=) then exit;
b[lef[x]]:=b[x];b[x]:=b[rig[x]]+b[rig[lef[x]]]+;
f:=x;l:=lef[x];
lef[f]:=rig[l];
rig[l]:=f;
x:=l;
end;
procedure lt(var x:longint);
var f,r:longint;
begin
if (x=) or (rig[x]=) then exit;
b[rig[x]]:=b[x];b[x]:=b[lef[x]]+b[lef[rig[x]]]+;
f:=x;r:=rig[x];
rig[f]:=lef[r];
lef[r]:=f;
x:=r;
end;
procedure ins(var x:longint;y:longint);
begin
if x= then
begin
x:=newp(y);
exit;
end;
if y<c[x] then
begin
ins(lef[x],y);
b[x]:=b[lef[x]]+b[rig[x]]+;
if fix[lef[x]]<fix[x] then rt(x);
end
else
begin
ins(rig[x],y);
b[x]:=b[lef[x]]+b[rig[x]]+;
if fix[rig[x]]<fix[x] then lt(x);
end;
end;
procedure del(var x:longint;y:longint);
begin
if x= then exit;
if c[x]=y then
begin
if lef[x]= then x:=rig[x] else
if rig[x]= then x:=lef[x] else
if fix[lef[x]]>fix[rig[x]] then
begin
lt(x);
del(lef[x],y);
b[x]:=b[lef[x]]+b[rig[x]]+;
end
else begin
rt(x);
del(rig[x],y);
b[x]:=b[lef[x]]+b[rig[x]]+;
end;
end
else if y<c[x] then
begin
del(lef[x],y);
b[x]:=b[lef[x]]+b[rig[x]]+;
end
else begin
del(rig[x],y);
b[x]:=b[rig[x]]+b[lef[x]]+;
end;
end;
function grank(x,y:longint):longint;
begin
if x= then exit();
if c[x]>=y then exit(grank(lef[x],y)) else exit(b[lef[x]]++grank(rig[x],y));
end;
function gmin(x:longint):longint;
begin
if x= then exit(maxlongint);
while lef[x]<> do x:=lef[x];
exit(c[x]);
end;
function gmax(x:longint):longint;
begin
if x= then exit(-maxlongint);
while rig[x]<> do x:=rig[x];
exit(c[x]);
end;
function getrank(z,x,y,l,r,t:longint):longint;
begin
if l>r then exit();
if (x=l) and (y=r) then exit(grank(a[z],t));
exit(getrank(z*,x,(x+y) div ,l,min(r,(x+y) div ),t)+
getrank(z*+,(x+y) div +,y,max((x+y) div +,l),r,t));
end;
function getmin(z,x,y,l,r:longint):longint;
begin
if l>r then exit(maxlongint);
if (x=l) and (y=r) then exit(gmin(a[z]));
exit(min(getmin(z*,x,(x+y) div ,l,min(r,(x+y) div )),
getmin(z*+,(x+y) div +,y,max((x+y) div +,l),r)));
end;
function getmax(z,x,y,l,r:longint):longint;
begin
if l>r then exit(-maxlongint);
if (x=l) and (y=r) then exit(gmax(a[z]));
exit(max(getmax(z*,x,(x+y) div ,l,min(r,(x+y) div )),
getmax(z*+,(x+y) div +,y,max((x+y) div +,l),r)));
end;
function rankget(x,y,z:longint):longint;
var l,r,m:longint;
begin
l:=getmin(,,n,x,y);
r:=getmax(,,n,x,y);
while l<=r do
begin
m:=(l+r) div ;
if getrank(,,n,x,y,m)<=(z-) then
begin
l:=m+;
rankget:=m;
end
else r:=m-;
end;
end;
procedure built(z,x,y:longint);
begin
if x=y then d[x]:=z else
begin
built(z*,x,(x+y) div );
built(z*+,(x+y) div +,y);
end;
a[z]:=;
end;
procedure putin(x,y:longint);
begin
x:=d[x];
while x> do
begin
ins(a[x],y);
x:=x div ;
end;
end;
procedure change(x,y:longint);
var z:longint;
begin
x:=d[x];
z:=c[a[x]];
while x> do
begin
del(a[x],z);
ins(a[x],y);
x:=x div ;
end;
end;
begin
readln(n,m);
built(,,n);
for i:= to n do
begin
read(j);
putin(i,j);
end;
readln;
for i:= to m do
begin
read(ch);
case upcase(ch) of
'Q':begin
readln(j,k,l);
writeln(rankget(j,k,l));
end;
'C':begin
readln(j,k);
change(j,k);
end;
end; end;
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. 文字在div中水平和垂直居中的的css样式

    文字在div中水平和垂直居中的的css样式 text-align:center; /*水平居中*/ line-height: 20px; /*行距设为与div高度一致*/ 示例如下: HTML元素 & ...

  2. 数组的map方法

    map方法 不支持IE6.7 .8 array1.map(fn) array1.map(fn[,thisArg]) 注意: fn 必须是函数,如果不是函数则会报错  TypeError: undefi ...

  3. python实现二分查找与冒泡排序

    二分查找,代码如下: def binarySearch(l, t): low, high = 0, len(l) - 1 while low < high: 'print low, high' ...

  4. 深圳尚学堂:Android APP的测试流程

    每一个新开发的软件都避免不了测试,我在这里总结了一些Android系统的移动端APP测试的一些测试流程,希望可以给大家一些帮助. 1. UI 测试App主要核ui与实际设计的效果图是否一致:交互方面的 ...

  5. 用Hashcat每秒计算1.4亿个密码,破解隔壁WIFI密码

    Hashcat是啥 Hashcat是什么呢?Hashcat是当前最强大的开源密码恢复工具,你可以访问Hashcat.net网站来了解这款工具的详细情况.本质上,Hashcat 3.0是一款高级密码恢复 ...

  6. final对于访问效率的影响

    在能够通过编译的前提下,无论局部变量声明时带不带final关键字修饰,对其访问的效率都一样. 并且:重复访问一个局部变量比重复访问一个成员或静态变量快:即便将其final修饰符去掉,效果也一样. 例如 ...

  7. Python之字符串详解1

    1. 查看类型 name = 'allen' print(type(name)) #查看类型 <class 'str'> #类型为str age = 19 print(type(name) ...

  8. 关于post与get请求参数存在特殊字符问题

    遇到项目中存在文本编辑框输入特殊字符 比如:# ? & 空格 , 导致后台接受不到参数问题,对可能存在特殊字符的参数进行encodeURIComponent; C#后台接受参数不需要解码 也可 ...

  9. DOM解析,取得XML文件里面的信息

    1 创建解析器工厂 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 2 解析器工厂对象创建解析器对象 Do ...

  10. Java三大修饰符

    1.static 修饰: 修饰属性:类变量,全类共有 修饰方法:静态方法,静态方法中不能直接访问非静态的方法和属性 静态方法只能被静态方法覆盖,并且没有多态 静态的方法或者属性不依赖于对象:类名.方法 ...