无旋Treap【模板】P3369
题目

详情见链接。
代码
#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的更多相关文章
- 无旋Treap模板
传送门 Code #include<bits/stdc++.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) # ...
- 无旋treap的简单思想以及模板
因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...
- 模板 - 数据结构 - 可持久化无旋Treap/PersistentFHQTreap
有可能当树中有键值相同的节点时,貌似是要对Split和Merge均进行复制的,本人实测:只在Split的时候复制得到了一个WA,但只在Merge的时候复制还是AC,可能是恰好又躲过去了.有人说假如确保 ...
- 模板 - 无旋Treap
一般而言作为一棵平衡树只需要插入,删除,值求排名,排名求值,前驱,后继,六个接口. #include<bits/stdc++.h> using namespace std; typedef ...
- 洛谷 - P3391 【模板】文艺平衡树(Splay) - 无旋Treap
https://www.luogu.org/problem/P3391 使用无旋Treap维护序列,注意的是按顺序插入的序列,所以Insert实际上简化成直接root和Merge合并,但是假如要在序列 ...
- 浅谈无旋treap(fhq_treap)
一.简介 无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树. 无旋Treap是一个叫 ...
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- 【算法学习】Fhq-Treap(无旋Treap)
Treap——大名鼎鼎的随机二叉查找树,以优异的性能和简单的实现在OIer们中广泛流传. 这篇blog介绍一种不需要旋转操作来维护的Treap,即无旋Treap,也称Fhq-Treap. 它的巧妙之处 ...
- [转载]无旋treap:从单点到区间(例题 BZOJ1500&NOI2005 维护数列 )
转自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182631.html 1500: [NOI2005]维修数列 Time Limit: 10 Sec Mem ...
- [转载]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
转载自ZZH大佬,原文:http://www.cnblogs.com/LadyLex/p/7182491.html 今天我们来学习一种新的数据结构:无旋treap.它和splay一样支持区间操作,和t ...
随机推荐
- HDU - 4284 Travel(floyd+状压dp)
Travel PP loves travel. Her dream is to travel around country A which consists of N cities and M roa ...
- 如何選擇最佳的 Wi-Fi 無線網路頻道,獲得最佳的傳輸速度(转载)
转自:https://blog.gtwang.org/useful-tools/how-to-find-the-best-wi-fi-channel-for-your-router/
- npm ERR! mathine_call@1.0.0 dev: `webpack-dev-server --inline --progress --config build/webpack.dev.conf.js` npm ERR! Exit status 1
internal/modules/cjs/loader.js:583 throw err; ^ Error: Cannot find module 'webpack' at Function.Modu ...
- 2017-9-13 NOIP模拟赛[xxy]
全排列 (permutation.cpp/c/pas)Description从 n 个不同元素中任取 m(m≤n)个元素,按照一定的顺序排列起来,叫做从 n个不同元素中取出 m 个元素的一个排列.当 ...
- [Xcode 实际操作]六、媒体与动画-(10)UIView视图翻转动的画制作
目录:[Swift]Xcode实际操作 本文将演示翻转动画的制作. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class ViewC ...
- js组件化(转载)
今天想着开始封装自己的UI库和组件库,从网上看到一篇很好的关于js组件化的文章,现在分享一下. 转载地址:https://blog.csdn.net/Prince_fmx/article/detail ...
- 【NOI2012】迷失游乐园
题目链接:迷失游乐园(BZOJ) 迷失游乐园(Luogu) 独立完成的题,写一发题解纪念一波~ 模拟完样例大概可以知道是道树形DP了. 观察数据范围,发现是基环树,至少会有一个环. 先从树的部分开始 ...
- JXl常用解析详解
目的: java解析 excel 无非就是apache poi 或者 jxl 两者在使用上其实都差不多,关键还是看你自己熟悉那个,用那个!我也是初次接触jxl 看很多博客说 jxl只适用于处理小数据量 ...
- Python web前端 11 form 和 ajax
Python web前端 11 form 和 ajax 一.打开服务器 将handlers.py.httpd.py和libs.py三个文件放入新文件夹中,双击打开httpd.py文件即可 二.ajax ...
- Codeforces Round #562 (Div. 2) C. Increasing by Modulo
链接:https://codeforces.com/contest/1169/problem/C 题意: Toad Zitz has an array of integers, each intege ...