题目

详情见链接

代码

 #include<cstdio>
#include<iostream>
#define outd(x) printf("%d\n",x)
#define outld(x) printf("%lld\n", x)
#define ls(x) arr[x].child[0]
#define rs(x) arr[x].child[1]
inline int read_int()
{
char c;
int ret = , sgn = ;
do { c = getchar(); } while ((c < '' || c > '') && c != '-');
if (c == '-') sgn = -; else ret = c - '';
while ((c = getchar()) >= '' && c <= '') ret = ret * + (c - '');
return sgn * ret;
}
using namespace std; const int maxn = + ; struct node
{
int child[], size, value, key;
}arr[maxn];
int tot; //当前节点个数 inline void push_up(int index)
{
arr[index].size = arr[ls(index)].size + arr[rs(index)].size + ;
} void split(int root, int& x, int& y, int value) //x中的小于或等于value,y中的大于value
{
if (!root) { x = y = ; return; }
if (arr[root].value <= value) { x = root; split(rs(root), rs(x), y, value); }
else { y = root; split(ls(root), x, ls(y), value); }
push_up(root);
} void merge(int&root, int x, int y)
{
if (!x || !y) { root = x + y; return; } //其中一个为0,root等于另一个
if (arr[x].key < arr[y].key) { root = x; merge(rs(root), rs(x), y); }
else { root = y; merge(ls(root), x,ls(y)); }
push_up(root);
} inline void insert(int& root, int value)
{
int x = , y = , z = ++tot;
arr[z].value = value, arr[z].size = , arr[z].key = rand();
split(root, x, y, value);
merge(x, x, z);
merge(root, x, y);
} inline void erase(int& root, int value)
{
int x = , y = , z = ;
split(root, x, y, value);
split(x, x, z, value - ); //z中全是value
merge(z, ls(z), rs(z));
merge(x, x, z);
merge(root, x, y);
} inline int Kth_number(int root, int k)
{
while (arr[ls(root)].size + != k)
{
if (arr[ls(root)].size >= k) root = ls(root);
else { k -= (arr[ls(root)].size + ); root = rs(root); }
}
return arr[root].value;
} inline int Get_rank(int& root, int value)
{
int x = , y = ;
split(root, x, y, value - );
int res = arr[x].size + ;
merge(root, x, y);
return res;
} inline int Pre(int& root, int value)
{
int x = , y = ;
split(root, x, y, value - );
int res = Kth_number(x, arr[x].size);
merge(root, x, y); //merge回去
return res;
} inline int Suf(int& root, int value)
{
int x = , y = ;
split(root, x, y,value);
int res = Kth_number(y, );
merge(root, x, y);
return res;
} int n, op, root; int main()
{
srand();
n = read_int();
while (n--)
{
op = read_int();
if (op == ) insert(root, read_int());
if (op == ) erase(root, read_int());
if (op == ) outd(Get_rank(root, read_int()));
if (op == ) outd(Kth_number(root, read_int()));
if (op == ) outd(Pre(root, read_int()));
if (op == ) outd(Suf(root, read_int()));
} return ;
}

参考视频链接:https://www.bilibili.com/video/av46204315/?p=2

无旋Treap【模板】P3369的更多相关文章

  1. 无旋Treap模板

    传送门 Code  #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) # ...

  2. 无旋treap的简单思想以及模板

    因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...

  3. 模板 - 数据结构 - 可持久化无旋Treap/PersistentFHQTreap

    有可能当树中有键值相同的节点时,貌似是要对Split和Merge均进行复制的,本人实测:只在Split的时候复制得到了一个WA,但只在Merge的时候复制还是AC,可能是恰好又躲过去了.有人说假如确保 ...

  4. 模板 - 无旋Treap

    一般而言作为一棵平衡树只需要插入,删除,值求排名,排名求值,前驱,后继,六个接口. #include<bits/stdc++.h> using namespace std; typedef ...

  5. 洛谷 - P3391 【模板】文艺平衡树(Splay) - 无旋Treap

    https://www.luogu.org/problem/P3391 使用无旋Treap维护序列,注意的是按顺序插入的序列,所以Insert实际上简化成直接root和Merge合并,但是假如要在序列 ...

  6. 浅谈无旋treap(fhq_treap)

    一.简介 无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树. 无旋Treap是一个叫 ...

  7. Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...

  8. 【算法学习】Fhq-Treap(无旋Treap)

    Treap——大名鼎鼎的随机二叉查找树,以优异的性能和简单的实现在OIer们中广泛流传. 这篇blog介绍一种不需要旋转操作来维护的Treap,即无旋Treap,也称Fhq-Treap. 它的巧妙之处 ...

  9. [转载]无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )

    转自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182631.html 1500: [NOI2005]维修数列 Time Limit: 10 Sec  Mem ...

  10. [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)

    转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...

随机推荐

  1. API---CreateIoCompletionPort

    HANDLE WINAPI CreateIoCompletionPort(  __in          HANDLE FileHandle,  __in          HANDLE Existi ...

  2. Post 提交用户名和密码, 用户自动登录,无需手动登录

    public void AutoPost(string url,string domain, string userName) { AlipayProxy.UserReg.UserReg userRe ...

  3. QDUOJ 炸老师与他的女朋友们 bfs+状压

    炸老师与他的女朋友们 Description qdu最帅的炸老师今天又要抽空去找他的女朋友们了,但是考虑到他的好gay友ycb仍是个单身狗,炸老师作为基友不希望打击他.所以他在找女朋友们的路途中必须要 ...

  4. 转换嵌套JSON数据为TABLE

    先准备一些数据: 创建一张临时表来存储: DECLARE @json_table AS TABLE ( [type] NVARCHAR(MAX), [desc] NVARCHAR(MAX) ) Sou ...

  5. 使用CTE生成辅助表(数字或时间)等

    数字辅助表: , ;WITH Digital_Rangs(Digital) AS ( SELECT @start_digital UNION ALL FROM [Digital_Rangs] WHER ...

  6. MySQL8.0.16新特性:The Communication Protocol In Group Replication

    MGR优雅升级到MySQL8.0.16 传统的升级手段之一,5.7 MGR集群与8.0 MGR集群进行数据传输,程序切换新集群后测试是否正常. 如果不正常,要么将新集群的新增数据同步回旧集群,要么就舍 ...

  7. 719D(树形dp)

    题目链接:http://codeforces.com/contest/791/problem/D 题意:给出一棵树,每两个点之间的距离为1,一步最多可以走距离 k,问要将任意两个点之间的路径都走一遍, ...

  8. 背包dp

    一大波模板正在靠近 1.01背包 问题:有n件物品和一个容量为v的背包,第i件物品的费用(即体积)是w[i],价值是v[i],求解将哪些物品装入背包可使这些物品的费用和不超过背包容量,且价值总和最大. ...

  9. jzoj6009. 【THUWC2019模拟2019.1.18】Counting (dp)

    Description 羽月最近发现,她发动能力的过程是这样的: 构建一个 V 个点的有向图 G,初始为没有任何边,接下来羽月在脑中构建出一个长度为 E 的边的序列,序列中元素两两不同,然后羽月将这些 ...

  10. C# File和fileinfo类

    两个类功能差不多,File是静态方法实现的,Fileinfo通过实例方法实现的: 文件操作例子: using System; using System.Collections.Generic; usi ...