Splay 区间操作(二)

首先基本操作如下:

删除第rank个点

void Remove(int id){//删除第rank个点
    rank++;
    int x = find(root, rank - 1);
    splay(x, 0);
    x = find(root, rank + 1);
    splay(x, root);
    ch[ch[root][1]][0] = 0;
    pushup(ch[root][1]),pushup(root);
    }

删除编号为id的点

void Remove(int id){//删除编号为id的点
    splay(id, 0);
    int rank = size[ch[root][0]] + 1;
    int x = find(root, rank - 1);
    splay(x, 0);
    x = find(root, rank + 1);//printf("root=%d\n", root);
    splay(x, root);
    ch[ch[root][1]][0] = 0;
    pushup(ch[root][1]),pushup(root);
    }

插入变成第rank个点

void insert(int rank,int v){//插入变成第rank个点
    int x = find(root, rank);
    splay(x, 0);//printf("size=%d\n",size[ch[root][0]]);
    x = find(root, rank + 1);
    splay(x, root);
    ch[ch[root][1]][0] = New(ch[root][1], v);
    pushup(ch[root][1]),pushup(root);
    }

区间翻转在上一篇博客有了。值得注意的是:\(Splay\)常数较大,有时一个操作需要多个基本操作一起并用,大大降低效率。所以在条件允许的情况下,我们尽量减少\(Splay\)的次数,达到相同的结果,详细会在以后的若干篇博客提及

原文地址:https://www.cnblogs.com/Tony-Double-Sky/p/9311408.html

时间: 2024-10-07 23:42:43

Splay 区间操作(二)的相关文章

[bzoj1500][NOI2005 维修数列] (splay区间操作)

Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目. 第2行包含N个数字,描述初始时的数列. 以下M行,每行一条命令,格式参见问题描述中的表格. 任何时刻数列中最多含有500 000个数,数列中任何一个数字均在[-1 000, 1 000]内. 插入的数字总数不超过4 000 000个,输入文件大小不超过20MBytes. Output 对于输入数据中的GET-SUM和MAX-SUM操作,向输出文件依次

算法模板——splay区间反转 2

实现功能:同splay区间反转 1(基于BZOJ3223 文艺平衡树) 这次改用了一个全新的模板(HansBug:琢磨了我大半天啊有木有),大大简化了程序,同时对于splay的功能也有所完善 这里面没有像一般二叉排序树那样子用一个参量进行排序,而是直接以中序遍历来构建了一个普通的二叉树(当然也可以把每个点的中序遍历排名视作参量),然后插入的时候就是指定位置插入(这个就比较像是文本插入了) 总之得到了较大的提升,代码优美程度也提高不少 1 var 2 i,j,k,l,m,n,head,tot,ll

Java I/O流操作(二)---缓冲流[转]

转自:http://blog.csdn.net/johnny901114/article/details/8710403 一.BufferWriter类 IO的缓冲区的存在就是为了提高效率,把要操作的数据放进缓冲区,然后一次性把缓冲区的内容写到目的地,而不是写一次就往目的地写一次. 在这里要注意的是当我们关闭了缓冲区对象实际也关闭了与缓冲区关联的流对象. BufferWriter类 try { FileWriter fw =new FileWriter("test.txt"); //使

ASP.NET MVC3 实例(六) 增加、修改和删除操作(二)

http://www.jquery001.com/asp.net-mvc3-instance-add-update-delete2.html 上篇我们在 ASP.NET MVC3 中实现了添加操作,由于时间关系没有完成修改.删除操作,我们新建了一个名为"Contact"的 Controller,并实现了添加方法,下边就让我们在此基础上来完成 ASP.NET MVC3 中的修改和删除操作. 首先,我们在 Contact 控制器类中添加一个名为 View()的方法,用来从 Contact

hdu 1890 Robotic Sort(splay 区间反转+删点)

题目链接:hdu 1890 Robotic Sort 题意: 给你n个数,每次找到第i小的数的位置,然后输出这个位置,然后将这个位置前面的数翻转一下,然后删除这个数,这样执行n次. 题解: 典型的splay区间翻转+删点. 我们把数据排序,然后记录一下每个数原来的位置,然后splay建树的时候用原来的位置来对应,这样val[i].second就直接是这个数在splay中的那个节点. (当然你也可以普通建树,然后手动记录位置). 然后我们把要找的那个数对应的节点旋转到根,然后根左边的size+i就

hdu 4348 To the moon(主席树区间操作)

题目链接:hdu 4348 To the moon 题意: 给你n个数,有m个操作. 1.给区间[l,r]的所有数+d,并且时间戳+1 2.询问当前时间戳的区间和. 3.询问过去时间戳t的区间和. 4.退回到时间戳t. 题解: 直接上主席树. 不过区间操作的时候push_down空间似乎不是那么够用. 所有把push_down这个操作去掉. 用一个标记记录当前这个区间的累加. 询问的时候就将这个累加传下去.(具体看代码) 最后还有退回状态t的时候可以把cnt=root[t+1], 因为后面的内存

postgresql事务的操作二

参照网页: http://www.php100.com/manual/PostgreSQL8/sql-set-transaction.html show transaction isolation level ; 查看事务隔离级别 testdb=# show transaction isolation level; transaction_isolation----------------------- read committed(1 行记录) testdb=> set transaction

GIS基础软件及操作(二)

原文 GIS基础软件及操作(二) 练习二.管理地理空间数据库 1.利用ArcCatalog 管理地理空间数据库 2.在ArcMap中编辑属性数据 第1步 启动 ArcCatalog 打开一个地理数据库 当 ArcCatalog打开后,点击, 按钮(连接到文件夹). 建立到包含练习数据的连接(比如“E:\ARCGIS\2练习二\Exec2”), 在ArcCatalog窗口左边的目录树中, 点击上面创建的文件夹的连接图标旁的 (+)号,双击个人空间数据库- National.mdb.打开它.. 在N

IOS学习之IOS沙盒(sandbox)机制和文件操作(二)

我们看看如何获取应用程序沙盒目录.包括真机的沙盒的目录. 1.获取程序的Home目录 NSString *homeDirectory = NSHomeDirectory(); NSLog(@"path:%@", homeDirectory); 打印结果: 2012-06-17 14:00:06.098 IosSandbox[3536:f803] /Users/rongfzh/Library/Application Support/iPhone Simulator/5.1/ Applic