1901: Zju2112 Dynamic Rankings
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
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3
Sample Output
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的更多相关文章
- BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7143 Solved: 2968[Su ...
- Bzoj 1901: Zju2112 Dynamic Rankings 树套树,线段树,平衡树,Treap
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6471 Solved: 2697[Su ...
- Bzoj 1901: Zju2112 Dynamic Rankings 主席树,可持久,树状数组,离散化
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 6321 Solved: 2628[Su ...
- BZOJ 1901: Zju2112 Dynamic Rankings( 树状数组套主席树 )
裸的带修改主席树.. 之前用BIT套Splay( http://www.cnblogs.com/JSZX11556/p/4625552.html )A过..但是还是线段树好写...而且快(常数比平衡树 ...
- BZOJ 1901: Zju2112 Dynamic Rankings( BIT 套 BST )
BIT 套 splay 其实也是不难...每个 BIT 的结点保存一颗 splay , 询问就二分答案然后判断rank... ------------------------------------- ...
- bzoj 1901: Zju2112 Dynamic Rankings(树套树)
1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...
- BZOJ 1901 Zju2112 Dynamic Rankings
树阵主席设置树.维护间隔动态K大. .. ZOJ到空间太小,太大,仅仅能到BZOJ上交 1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memor ...
- bzoj 1901: Zju2112 Dynamic Rankings -- 主席树,树状数组,哈希
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Description 给定一个含有n个数的序列a[1] ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...
随机推荐
- because of many connection errors; unblock with 'mysqladmin flush-hosts
环境:linux,mysql5.5.37 错误:Host is blocked because of many connection errors; unblock with 'mysqladmin ...
- #DP# ----- OpenJudge最大子矩阵
OpenJudge 1768:最大子矩阵 总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 ...
- Java之模板方法模式(Template Method)
Java之模板方法模式(Template Method) 1. 概念:定义一个算法的骨架,而将一些实现步骤延迟到子类中. 把不变的行为搬到超类,去除子类中重复的代码来体现他的优势. 2. UML图: ...
- mac命令行对复杂ipa包重新签名
最近在做ios的自动化平台,需要通过命令行安装卸载ipa包 好了问题来,别人上传的ipa包,很可能是开发签名了只能在特定手机上安装的测试ipa包,那我们如何将其安装在我们的自动化的iphone上呢? ...
- python属性查找(attribute lookup)
在Python中,属性查找(attribute lookup)是比较复杂的,特别是涉及到描述符descriptor的时候. 在上一文章末尾,给出了一段代码,就涉及到descriptor与att ...
- HttpClient 4.3连接池参数配置及源码解读
目前所在公司使用HttpClient 4.3.3版本发送Rest请求,调用接口.最近出现了调用查询接口服务慢的生产问题,在排查整个调用链可能存在的问题时(从客户端发起Http请求->ESB-&g ...
- SQL 增删改查45道题
create database School use School go create table Student --1.学生表 ( Sno ) not null primary key,--学号( ...
- java系列笔记---正则表达式(1)常用符号
正则表达式---常用符号 首先声明,我这里列表的是经常使用的一些符号,如果你想得到全部,那建议你通过API中,搜索Pattern类,会得到所有符号. 字符类 [abc] a.b 或 c(简单类) [^ ...
- Oracle_关联查询
1. 等值连接(Equijoin).非等值连接(Non-Equijoin).外连接(Outer join):-->左外连接-->右外连接.自连接(Self join) 交叉连接(Cross ...
- 阿里云oss总是提示SignatureDoesNotMatch错误怎么办
网上的所有阿里云oss(C#)的例子几乎试遍了,为什么还是提示SignatureDoesNotMatch错误?什么原因?怎么办?下载一个阿里云提供的windows客户端发现,依然提示签名错误. 开始怀 ...