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. CAReplicatorLayer复制Layer和动画, 实现神奇的效果

    今天我们看下CAReplicatorLayer, 官方的解释是一个高效处理复制图层的中间层.他能复制图层的所有属性,包括动画. 一样我们先看下头文件 @interface CAReplicatorLa ...

  2. 二分查找 - vb.net

    Module Module1    Sub Main()        Dim array(999) As Integer        Dim searchValue As Integer      ...

  3. 使用 visualstudio code 编辑器调试执行在 homestead 环境中的 laravel 程序

    由于之前做 .net 开发比较熟悉 visualstudio,所以自 visualstudio code 发布后就一直在不同场合使用 vscode ,比如前端.node等等.最近在做 laravel ...

  4. MySQL插入数据中文乱码问题的解决

    一.使用语句 show variables like 'character%'; 来查看当前数据库的相关编码集. 1.启动cmd,登录mysql ①cd C:\Program Files\MySQL\ ...

  5. 第七届蓝桥杯javaB组真题解析-煤球数目(第一题)

    题目 /* 煤球数目 有一堆煤球,堆成三角棱锥形.具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), .... 如果一共有100层,共有 ...

  6. 蓝桥网试题 java 基础练习 十六进制转十进制

    ---------------------------------------------------------------------------------------- 貌似用int类型不会超 ...

  7. (@WhiteTaken)设计模式学习——简单工厂

    最近工作比较忙,所以没有怎么写博客,这几天将集中学习一下(厉风行)讲解的设计模式的相关知识,并对主要的代码进行介绍. 言归正传,接下来介绍最简单也是最基础的简单工厂设计模式. 什么是简单工厂? 简单工 ...

  8. udp服务器监听(多线程)

    项目一:udp1111 监听的有三个文件分别为: guiHello.java 有关界面和事件响应功能 UdpFunc.java是udp类的封装:发送和接收 udpServer.java是入口函数,无实 ...

  9. 基于Spring DM管理的Bundle获取Spring上下文对象及指定Bean对象

    在讲述服务注册与引用的随笔中,有提到context.getServiceReferences()方法,通过该方法可以获取到OSGI框架容器中的指定类型的服务引用,从而获取到对应的服务对象.同时该方法还 ...

  10. Redis 学习之事务处理

    Redis事务机制 在MySQL等其他数据库中,事务表示的是一组动作,这组动作要么全部执行,要么全部不执行. Redis目前对事物的支持相对简单.Redis只能保证一个client发起的事务中的命令可 ...