type rec=record
lc,rc,v,rnd,size,w,fa:longint;
end; var
n,root,tot,ans,opt,x,i,po:longint;
tr:array[..] of rec; procedure rotl(po:longint);
var
y:longint;
begin
y:=tr[po].rc;
tr[po].rc:=tr[y].lc;
if tr[y].lc> then tr[tr[y].lc].fa:=po;
tr[y].fa:=tr[po].fa;
if tr[po].fa= then root:=y else
if po=tr[tr[po].fa].lc then
tr[tr[po].fa].lc:=y else tr[tr[po].fa].rc:=y;
tr[y].lc:=po;
tr[po].fa:=y;
tr[y].size:=tr[po].size;
tr[po].size:=tr[tr[po].lc].size+tr[tr[po].rc].size+tr[po].w;
end; procedure rotr(po:longint);
var
y:longint;
begin
y:=tr[po].lc;
tr[po].lc:=tr[y].rc;
if tr[y].rc> then tr[tr[y].rc].fa:=po;
tr[y].fa:=tr[po].fa;
if tr[po].fa= then root:=y else
if po=tr[tr[po].fa].lc then
tr[tr[po].fa].lc:=y else tr[tr[po].fa].rc:=y;
tr[y].rc:=po;
tr[po].fa:=y;
tr[y].size:=tr[po].size;
tr[po].size:=tr[tr[po].lc].size+tr[tr[po].rc].size+tr[po].w;
end; procedure ins(x,po:longint);
begin
inc(tr[po].size);
if x=tr[po].v then
begin
inc(tr[po].w);
exit;
end; if x<tr[po].v then
begin
if tr[po].lc= then
begin
inc(tot);
tr[tot].fa:=po;
tr[tot].v:=x;
tr[tot].size:=;
tr[tot].w:=;
tr[tot].rnd:=random()+;
tr[po].lc:=tot;
if tr[tot].rnd<tr[po].rnd then rotr(po);
end else
begin
ins(x,tr[po].lc);
if tr[tr[po].lc].rnd<tr[po].rnd then rotr(po);
end;
end; if x>tr[po].v then
begin
if tr[po].rc= then
begin
inc(tot);
tr[tot].fa:=po;
tr[tot].v:=x;
tr[tot].size:=;
tr[tot].w:=;
tr[tot].rnd:=random()+;
tr[po].rc:=tot;
if tr[tot].rnd<tr[po].rnd then rotl(po);
end else
begin
ins(x,tr[po].rc);
if tr[tr[po].rc].rnd<tr[po].rnd then rotl(po);
end;
end;
end; function find(x,po:longint):longint;
begin
dec(tr[po].size);
if x<tr[po].v then exit(find(x,tr[po].lc));
if x>tr[po].v then exit(find(x,tr[po].rc));
if x=tr[po].v then exit(po);
end; procedure del(po:longint);
begin
while(tr[po].lc>) or (tr[po].rc>) do
begin
if tr[po].lc= then
begin
rotl(po);
tr[tr[po].fa].size:=tr[tr[tr[po].fa].rc].size+tr[tr[po].lc].size+tr[tr[po].rc].size+tr[tr[po].fa].w;
continue;
end; if tr[po].rc= then
begin
rotr(po);
tr[tr[po].fa].size:=tr[tr[tr[po].fa].lc].size+tr[tr[po].lc].size+tr[tr[po].rc].size+tr[tr[po].fa].w;
continue;
end; if tr[tr[po].lc].rnd>tr[tr[po].rc].rnd then
begin
rotl(po);
tr[tr[po].fa].size:=tr[tr[tr[po].fa].rc].size+tr[tr[po].lc].size+tr[tr[po].rc].size+tr[tr[po].fa].w;
end
else
begin
rotr(po);
tr[tr[po].fa].size:=tr[tr[tr[po].fa].lc].size+tr[tr[po].lc].size+tr[tr[po].rc].size+tr[tr[po].fa].w;
end;
end; if tr[tr[po].fa].lc=po then
begin
tr[tr[po].fa].lc:=;
tr[tr[po].fa].size:=tr[tr[tr[po].fa].rc].size+tr[tr[po].fa].w;
end
if tr[tr[po].fa].rc=po then
begin
tr[tr[po].fa].rc:=;
tr[tr[po].fa].size:=tr[tr[tr[po].fa].lc].size+tr[tr[po].fa].w;
end; tr[po].size:=;tr[po].w:=; end; procedure num(x,po:longint);
begin
if x<=tr[tr[po].lc].size then
begin
num(x,tr[po].lc);
exit;
end; if x>tr[tr[po].lc].size+tr[po].w then
begin
num(x-tr[tr[po].lc].size-tr[po].w,tr[po].rc);
exit;
end; writeln(tr[po].v);
end; procedure rank(x,po:longint);
begin
if x<tr[po].v then
begin
rank(x,tr[po].lc);
exit;
end; if x>tr[po].v then
begin
ans:=ans+tr[tr[po].lc].size+tr[po].w;
rank(x,tr[po].rc);
exit;
end; ans:=ans+tr[tr[po].lc].size+;
end; procedure pre(x,po:longint);
begin
if po= then exit;
if (tr[po].v<x) then
begin
ans:=tr[po].v;
pre(x,tr[po].rc);
end else pre(x,tr[po].lc);
end; procedure suc(x,po:longint);
begin
if po= then exit;
if (tr[po].v>x) then
begin
ans:=tr[po].v;suc(x,tr[po].lc);
end else suc(x,tr[po].rc);
end; begin randomize;
read(n); for i:= to n do
begin
read(opt,x);
if opt= then
begin
if tr[root].w= then
begin
inc(tot);
tr[tot].v:=x;tr[tot].size:=;tr[tot].w:=;
tr[tot].rnd:=random()+;
root:=tot;
end else ins(x,root);
end;
if opt= then begin po:=find(x,root);if tr[po].w> then begin dec(tr[po].w);continue;end;del(po); end;
if opt= then begin ans:=;rank(x,root); writeln(ans);end;
if opt= then num(x,root);
if opt= then begin pre(x,root); writeln(ans); end;
if opt= then begin suc(x,root); writeln(ans); end;
end; end.

------------------------------------------------------

非旋treap

CODECHEF LTIME16 CHEFC

#include <cstdio>
#include <algorithm>
#define LL long long
using namespace std; int a[],T,n,root,q; struct treenode{
int lc,rc,lv,rv,v,ans,size;
}tr[]; void update(int po){
if (!tr[po].lc) tr[po].lv=tr[po].v;else tr[po].lv=tr[tr[po].lc].lv;
if (!tr[po].rc) tr[po].rv=tr[po].v;else tr[po].rv=tr[tr[po].rc].rv; tr[po].ans=tr[tr[po].lc].ans+tr[tr[po].rc].ans;
if (tr[po].lc) tr[po].ans+=tr[po].v!=tr[tr[po].lc].rv;
if (tr[po].rc) tr[po].ans+=tr[po].v!=tr[tr[po].rc].lv; tr[po].size=tr[tr[po].lc].size+tr[tr[po].rc].size+;
} int build(int l,int r){
int mid=(l+r)>>;
tr[mid].v=a[mid];tr[mid].size=tr[mid].ans=;tr[mid].lc=tr[mid].rc=;
if (l==r){
tr[mid].lv=tr[mid].rv=tr[mid].v;tr[mid].size=;
return(mid);
} if (l!=mid) tr[mid].lc=build(l,mid-);
if (r!=mid) tr[mid].rc=build(mid+,r);
update(mid);
return(mid);
} void split(int po,int &root1,int &root2,int k){
if (tr[tr[po].lc].size==k){
root1=tr[po].lc;root2=po;
tr[po].lc=;
update(po);
return;
}
if (tr[tr[po].lc].size==k-){
root1=po;root2=tr[po].rc;
tr[po].rc=;
update(po);
return;
} if (k<=tr[tr[po].lc].size){
split(tr[po].lc,root1,root2,k);
tr[po].lc=root2;
update(po);
root2=po;
}else{
split(tr[po].rc,root1,root2,k-tr[tr[po].lc].size-);
tr[po].rc=root1;
update(po);
root1=po;
}
} int merge(int po1,int po2){
if (po1==||po2==) return(po1|po2); if ((LL)rand()*tr[po1].size>(LL)rand()*tr[po2].size){
tr[po1].rc=merge(tr[po1].rc,po2);
update(po1);
return(po1);
}else{
tr[po2].lc=merge(po1,tr[po2].lc);
update(po2);
return(po2);
}
} void dfs_show(int po){
if (tr[po].lc) dfs_show(tr[po].lc);
printf("%d ",tr[po].v);
if (tr[po].rc) dfs_show(tr[po].rc);
} int main(){
scanf("%d",&T);
while (T--){
scanf("%d",&n);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
root=build(,n); scanf("%d",&q);
for (int i=;i<=q;i++){
int opt,l,r;
scanf("%d%d%d",&opt,&l,&r);
int root1,root2,root3;
split(root,root1,root2,l-); split(root2,root2,root3,r-l+); if (opt==){
root1=merge(root1,root3);
root=merge(root2,root1);
}else{
printf("%d\n",tr[root2].ans+);
root2=merge(root2,root3);
root=merge(root1,root2);
}
}
}
}

codevs 4543 treap 模板的更多相关文章

  1. BZOJ 1588: Treap 模板

    1588: [HNOI2002]营业额统计 Time Limit: 5 Sec  Memory Limit: 162 MBSubmit: 12171  Solved: 4352 Description ...

  2. [luogu3369]普通平衡树(treap模板)

    解题关键:treap模板保存. #include<cstdio> #include<cstring> #include<algorithm> #include< ...

  3. treap codevs 4543普通平衡树

    #include<cstdio>#include<ctime>#include<cstdlib>struct shu{ int l,r,sum1,zhi,dui,s ...

  4. Treap 模板 poj1442&hdu4557

    原理可以看hihocoder上面的讲解,很清楚,不多说了. 模板抄lrj训练指南上面的. /** Treap 实现 名次树 功能: 1.找到排名为k的元素 2.值为x的元素的名次 初始化:Node* ...

  5. 平衡树Treap模板与原理

    这次我们来讲一讲Treap(splay以后再更) 平衡树是一种排序二叉树(或二叉搜索树),所以排序二叉树可以迅速地判断两个值的大小,当然操作肯定不止那么多(不然我们还学什么). 而平衡树在排序二叉树的 ...

  6. POJ1442-查询第K大-Treap模板题

    模板题,以后要学splay,大概看一下treap就好了. #include <cstdio> #include <algorithm> #include <cstring ...

  7. Treap 模板

    感觉平衡树也没有以前想的那么玄乎,(其实set超好用的),非旋式Treap挺好理解,和可并堆,二叉搜索树有很大联系 推荐博客:http://memphis.is-programmer.com/post ...

  8. 【Treap模板详细注释】BZOJ3224-普通平衡树

    模板题:D错因见注释 #include<iostream> #include<cstdio> #include<cstring> #include<algor ...

  9. 非旋treap模板

    bzoj3580 非旋转treap 在大神教导下发现split一段区间时先split右边再split左边比较好写 #include <cstdio> #include <cstdli ...

随机推荐

  1. C++ 中指针与引用的区别

    指向不同类型的指针的区别在于指针类型可以知道编译器解释某个特定地址(指针指向的地址)中的内存内容及大小,而void*指针则只表示一个内存地址,编译器不能通过该指针所指向对象的类型和大小,因此想要通过v ...

  2. 彻底解决mysql中文乱码的办法,修改mysql解压缩版(免安装版或zip版)字符编码

    MySQL会出现中文乱码的原因不外乎下列几点:1.server本身设定问题,例如server字符编码还停留在latin12.table的语系设定问题(包含character与collation)3.客 ...

  3. ExtJs4 笔记(14) layout 布局

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/)版权声明:本文的版权归作者与博客园共有.转载时须注明本文的详细链接,否则作者将保留追究其法律 ...

  4. [转]forever: 让nodejs应用后台执行

    在LINUX中我们可以使用这种简单的方式让node.js在后台运行: nohup node your_app.js & forever可以让我们做得更好,并且可以跨平台的在windows和Li ...

  5. 单机搭建Android开发环境(二)

    前文介绍了如何优化SSD和内存,以发挥开发主机的最佳性能,同时提到在SSD上创建虚拟机.为什么不装双系统呢?双系统性能应该会更好!采用Windows+虚拟机的方式,主要是考虑到安卓开发和日常办公两方面 ...

  6. Flex编译程序出现 Could not find compiled resource bundle 'SharedResources' for locale 'en_US'.

    Flex编译程序出现 Could not find compiled resource bundle 'SharedResources' for locale 'en_US'. 而且静态类居然为nul ...

  7. java 24 - 2 GUI之监听机制和适配器改进窗口关闭

    我们创建了窗体后,就要对窗体进行操作,比如关闭窗口.而这时候就要建立监听机制: 事件监听机制: A:事件源 事件发生的地方 B:事件 就是要发生的事情 C:事件处理 就是针对发生的事情做出的处理方案 ...

  8. java (基本语法)

    2.五大内存区 方法区就是存储共享数据的地方 3.一个实体多处引用 只有还有实体被指向,这个实体就不能消失.当所有的指向都消失之后,这个实体被视为垃圾,被垃圾回收机制不定期的回收. 堆里的实体能存储多 ...

  9. UIScrollView创建相册

    1.设置滚动相册 1.1将存放图片数组传过来,及当前图片的索引 1.2在控制器中创建ScrollView,设置它的contentSize,contentOffset. 1.3通过传过来的图片数组创建U ...

  10. UIScrollView解决无法触发手势

    //创建一个分类 //.h #import <UIKit/UIKit.h> @interface UIScrollView (Touch) - (void)touchesBegan:(NS ...