Treap 模板代码
struct Node {
int pri, data, num, sz, ch[2], fa;
}t[maxn];
int pos;
struct Treap {
int root;
int newNode(int x) {
t[++ pos] = (Node){rand(), x, 1, 1, 0, 0, 0};
return pos;
}
void update(int x) {
t[x].sz = t[t[x].ch[0]].sz + t[t[x].ch[1]].sz + t[x].num;
}
int locate(int x) {
return x == t[t[x].fa].ch[1];
}
void rotate(int x){
int y = t[x].fa, z = t[y].fa, p = locate(x);
t[y].ch[p] = t[x].ch[p ^ 1], t[x].ch[p ^ 1] = y, t[t[y].ch[p]].fa = y;
t[x].fa = t[y].fa, t[y].fa = x;
update(y), update(x);
if (z) {
t[z].ch[t[z].ch[1] == y] = x;
update(z);
}
}
void maintain(int x) {
while (x) {
update(x);
x = t[x].fa;
}
}
void insert(int data) {
if (root == 0) {
root = newNode(data);
return ;
}
int x = root;
while (true) {
if (t[x].data == data){
t[x].num ++;
break;
}
int p = data > t[x].data;
if (!t[x].ch[p]) {
t[x].ch[p] = newNode(data);
t[t[x].ch[p]].fa = x;
x = t[x].ch[p];
break;
}
x = t[x].ch[p];
}
maintain(x);
while (t[x].fa && t[t[x].fa].pri < t[x].pri)
rotate(x);
if (t[x].fa == 0)
root = x;
}
int get_pos(int data) {
int x = root;
while (true) {
if (t[x].data == data)
return x;
int p = data > t[x].data;
x = t[x].ch[p];
}
return x;
}
void del(int data) {
int x = get_pos(data);
if (t[x].num > 1){
t[x].num --;
maintain(x);
return ;
}
while (t[x].ch[0] + t[x].ch[1]) {
int p = t[t[x].ch[1]].pri > t[t[x].ch[0]].pri;
rotate(t[x].ch[p]);
if (t[t[x].fa].fa == 0)
root = t[x].fa;
}
t[x].num = 0;
maintain(x);
t[t[x].fa].ch[locate(x)] = 0;
t[x].fa = 0;
if (root == x)
root = 0;
}
int rks(int data) {
int x = root;
int res = 0;
while (true) {
if (t[x].data == data)
return res + t[t[x].ch[0]].sz + 1;
if (t[x].data < data)
res += t[x].num + t[t[x].ch[0]].sz;
x = t[x].ch[(data > t[x].data)];
}
}
int kth(int k) {
int x = root;
while (x) {
if (t[t[x].ch[0]].sz >= k)
x = t[x].ch[0];
else if (t[x].num + t[t[x].ch[0]].sz >= k)
return t[x].data;
else k -= t[x].num + t[t[x].ch[0]].sz, x = t[x].ch[1];
}
}
int pre(int data) {
int x = root, ans;
while (x) {
if (t[x].data < data)
ans = t[x].data, x = t[x].ch[1];
else x = t[x].ch[0];
}
return ans;
}
int suf(int data) {
int x = root, ans;
while (x) {
if (t[x].data > data)
ans = t[x].data, x = t[x].ch[0];
else x = t[x].ch[1];
}
return ans;
}
}treap;
Treap 模板代码的更多相关文章
- BZOJ 1588: Treap 模板
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 12171 Solved: 4352 Description ...
- inputstream和outputstream读写数据模板代码
//读写数据模板代码 byte buffer[] = new byte[1024]; int len=0; while((len=in.read(buffer))>0){ out.write(b ...
- eclipse 中 Servlet 模板代码(其实是代码提示模板)
说的是模板代码,应该说的是提示的模板代码,并不是一新建就会出现模板. 第一步:先建一个Servlet文件,写好自己想要的模板 我的模板如下: 全选并复制,等会要粘贴到Servlet的提示模板中. pa ...
- 用Case类生成模板代码
将类定义为case类会生成许多模板代码,好处在于: ①会生成一个apply方法,这样就可以不用new关键字创建新的实例. ②由于case类的构造函数参数默认是val,那么构造函数参数会自动生成访问方法 ...
- django2用模板代码图标字体丢失报404 cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff
以前开发网站,不是用php就是用c#或java写后端,跟后端繁重麻烦的代码相比,前端的html+css+JavaScript简直就简单的不算技术,相比之下,工作量也不大. 但如果用django框架,使 ...
- 修改servlet的模板代码
实际开发中,这些生成的代码和注释一般我们都用不到的,每次都要手工删除这些注释和代码,很麻烦.下面以MyEclipse 2014(其实版本通用的,都可以修改)为例进行说明如何修改Servlet的模板代码 ...
- c#字符串加载wpf控件模板代码 - 简书
原文:c#字符串加载wpf控件模板代码 - 简书 ResourceManager resManagerA = new ResourceManager("cn.qssq666.Properti ...
- 在pycharm中自定义模板代码,快速输出固定代码块
pycharm中有时会经常输出固定一段代码,为避免每次重复输入,可以自定义一段模板代码,请看以下图教程: 1. 点击 file 里面的 setting 2. 在搜索框输入live,就会显示出 ...
- Flask数据库常见关系模板代码
常见关系模板代码 以下罗列了使用关系型数据库中常见关系定义模板代码 一对多 示例场景: 用户与其发布的帖子(用户表与帖子表) 角色与所属于该角色的用户(角色表与多用户表) 示例代码 class Rol ...
- flask 常见关系模板代码
以下罗列了使用关系型数据库中常见关系定义模板代码 一对多示例场景:用户与其发布的帖子(用户表与帖子表)角色与所属于该角色的用户(角色表与多用户表)示例代码class Role(db.Model): & ...
随机推荐
- 参考用例之“本地Excel导入系统测试方案”
本地Excel导入系统测试方案 Excel 代码 @Test public void importperson() throws FileNotFoundException { FileInputSt ...
- MCP 实践系列:EdgeOne 在线部署HTML页面
今天,我们将专门讲解一下 EdgeOne 在线部署 HTML 页面时所提供的 MCP 功能.这个功能对于个人用户来说非常实用,尤其适合一些小型应用场景,比如开发一个简单的小游戏,或者搭建一个小型网站, ...
- 树-BST基本实现
之前的数组, 栈, 链表, 队列等都是顺序数据结构, 这里来介绍一个非顺序数据结构, 树. 树在处理有层级相关的数据时非常有用, 还有在存储数据如数据库查询实现等场景也是高频使用. 作为一种分层数据的 ...
- Dify 架构全景:从模块设计到部署实践的完整指南
项目概述 Dify 是一个开源的 LLM 应用开发平台,提供直观的界面,结合了AI Agent工作流.RAG 管道.智能体能力.模型管理和可观察性功能等,使用户能够快速从原型转向生产环境.Dify 允 ...
- Qt图像处理技术七:轮廓提取
Qt图像处理技术七:轮廓提取 效果图 原理 图像先二值化让rgb数值相同,只有(0,0,0)或者(255,255,255) 取每个点的周围8个点,如果周围8个点与该点rgb值相同,则需要将该点描黑为( ...
- Python中的cls变量
技术背景 在Python的类型设计中,有时候会遇到一个cls参数.其实cls参数就是一个约定俗成的名称,用其他的名字也能正常运行但不建议这么用.它的作用类似于实例方法中的self参数,代表的是类本身, ...
- [书籍精读]《基于MVC的JavaScript Web富应用开发》精读笔记分享
写在前面 书籍介绍:<JavaScript异步编程>讲述基本的异步处理技巧,包括PubSub.事件模式.Promises等,通过这些技巧,可以更好的应对大型Web应用程序的复杂性,交互快速 ...
- UFT 对文件的处理(scripting.filesystemObject)
1. 文件路劲 2. 文件大小 3.写 4. 读 5. 复制 6. 内容替换
- XSY3490 / ZROI P618 广义线段树 + 莫队 + 点分树
\(Solution\) 为了与普通区间区分,我们称线段树上某个结点 \([l, r]\) 为 块 \([l, r]\) 考虑模拟线段树区间查询 \([l, r]\) 时下放到的底部端点,必然是一堆连 ...
- C# WinForm 控件设置双缓存
DataGridView.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instan ...