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啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...
随机推荐
- 大型网站制作前端使用PHP后台逻辑用 Java
对于网站团队,大概可以按照职责分为前端.后端.架构三种角色. 前端:负责所有和用户有交互的产品,包括 WEB以及手机客户端 后端:负责各种业务 API 的开发,以及服务器端其他系统的开发 架构:负责设 ...
- HTTP协议系列(3)---包括WebSocket简单介绍
一.HTTPS HTTP是超文本传输协议,那HTTPS是什么尼?要明白HTTPS是什么先要明白HTTP的缺点,想一下我们在使用HTTP的时候会有那些缺点尼? 1.通信使用的明文(不加密),内容 ...
- 蓝桥网试题 java 基础练习 特殊回文数
------------------------------------------------------------------------------------- 简单点,对话的方式简单点 有 ...
- ubuntu下安装pdo和pdo_mysql扩展
ubuntu下安装好LAMP后默认情况没有安装mysql_pdo扩展,以下是安装步聚 1 安装pdo sudo pecl install pdo 出现以下错误是说明pdo已经加入了php的默认安装,不 ...
- 读书笔记 effective c++ Item 2 尽量使用const,枚举(enums),内联(inlines),不要使用宏定义(define)
这个条目叫做,尽量使用编译器而不要使用预处理器更好.#define并没有当作语言本身的一部分. 例如下面的例子: #define ASPECT_RATIO 1.653 符号名称永远不会被编译器看到.它 ...
- SwingBench---ORACLE压力测试工具
SwingBench---ORACLE压力测试工具 ◆描述SwingBench是Oracle UK的一个员工在一个被抛弃的项目的基础上开发的.目前稳定版本2.5,基于JDK.该工具是免费的,可以在作者 ...
- Swift2.0 UITextView 和 UITextFile 的使用
在Swift2.0中,UITextFile 和 UITextView 的使用总体上和在OC中是一样的,今天只是给大家一段代码,然后说UITextView里面的光标位置的问题.先看他们使用的简单的代码 ...
- Jenkins在windows上的安装配置
今天是2月14号,所谓西方情人节,下班回来发现,2月14过的比七夕还火热.于是上网百度百科查询了"情人节". 毕竟是中国的百度啊.是这么解释的.我感到很欣慰.过得每一个节日都应该 ...
- matlab 全局变量的使用举例
昨天在写项目时,想要把获取到的临时变量放入一个全局变量,为以后的使用做准备,结果总是出错,今天做了一个小程序,放在这里备用. 自定义函数: global_p.m function y=global_p ...
- MySQL架构由小变大的演变过程
假设一个网站(discuz)从最开始访问量很小做到日pv千万,我们来推测一下它的mysql服务器架构演变过程. 第一阶段网站访问量日pv量级在1w以下.单台机器跑web和db,不需要做架构层调优(比如 ...