【模板】无旋Treap(FHQ)
如题,这是一个模板。。。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype> inline void read(int & x)
{
x = ;
int k = ;
char c = getchar();
while (!isdigit(c))
if (c == '-') c = getchar(), k = -;
else c = getchar();
while (isdigit(c))
x = (x << ) + (x << ) + (c ^ ),
c = getchar();
x *= k;
} const int MAXN = ;
int seed = ;
int m, x, tot, opt, rt = ;
int siz[MAXN], val[MAXN], rnd[MAXN], son[MAXN][]; inline int Rand()
{
return seed = (int)seed * 482711LL % ;
} inline void Pushup(int u)
{
siz[u] = siz[son[u][]] + siz[son[u][]] + ;
} inline int New(int x)
{
siz[++tot] = ;
val[tot] = x;
rnd[tot] = Rand();
son[tot][] = son[tot][] = ;
return tot;
} inline void Split(int u, int x, int &a, int &b)
{
if (!u) { a = b = ; return; }
if (val[u] <= x) a = u, Split(son[u][], x, son[a][], b);
else b = u, Split(son[u][], x, a, son[b][]);
Pushup(u);
} inline void Split_siz(int u, int k, int &a, int &b)
{
if (!u) { a = b = ; return; }
if (k <= siz[son[u][]]) b = u, Split_siz(son[u][], k, a, son[b][]);
else a = u, Split_siz(son[u][], k - siz[son[u][]] - , son[a][], b);
Pushup(u);
} inline void Merge(int & u, int a, int b)
{
if (!a || !b) { u = a | b; return; }
if (rnd[a] < rnd[b]) u = a, Merge(son[u][], son[a][], b);
else u = b, Merge(son[u][], a, son[b][]);
Pushup(u);
} inline int Findkth(int u, int k)
{
while (siz[son[u][]] + != k)
if (siz[son[u][]] >= k) u = son[u][];
else k -= siz[son[u][]] + , u = son[u][];
return u;
} inline void Insert(int x)
{
int a = , b = , c = ;
c = New(x);
Split(rt, x, a, b);
Merge(a, a, c);
Merge(rt, a, b);
} inline void Delete(int x)
{
int a = , b = , c = ;
Split(rt, x, a, b);
Split(a, x - , a, c);
Merge(c, son[c][], son[c][]);
Merge(a, a, c);
Merge(rt, a, b);
} inline void Getrank(int x)
{
int a = , b = ;
Split(rt, x - , a, b);
printf("%d\n", siz[a] + );
Merge(rt, a, b);
} inline void Getkth(int k)
{
int a = , b = , c = ;
//·½·¨1£ºÓú¯ÊýÄõÚk´ó
printf("%d\n", val[Findkth(rt, k)]);
return; //·½·¨2£º°´siz·ÖÁÑÄóöc
Split_siz(rt, k, a, b);
Split_siz(a, k - , a, c);
printf("%d\n", val[c]);
Merge(a, a, c);
Merge(rt, a, b);
} inline void Pre(int x)
{
int a = , b = ;
Split(rt, x - , a, b);
printf("%d\n", val[Findkth(a, siz[a])]);
Merge(rt, a, b);
} inline void Suf(int x)
{
int a = , b = ;
Split(rt, x, a, b);
printf("%d\n", val[Findkth(b, )]);
Merge(rt, a, b);
} signed main()
{
read(m);
for (int i = ; i <= m; ++i)
{
read(opt), read(x);
if (opt == ) Insert(x);
if (opt == ) Delete(x);
if (opt == ) Getrank(x);
if (opt == ) Getkth(x);
if (opt == ) Pre(x);
if (opt == ) Suf(x);
}
return ;
}
【模板】无旋Treap(FHQ)的更多相关文章
- 模板 - 无旋Treap
一般而言作为一棵平衡树只需要插入,删除,值求排名,排名求值,前驱,后继,六个接口. #include<bits/stdc++.h> using namespace std; typedef ...
- [模板] 无旋Treap (C++ class)
注意!本帖不是算法介绍!只是贴代码(逃) //嫌stdlib的rand太慢,手打了一个 /* Author: hotwords */ typedef unsigned int tkey; class ...
- 模板——无旋Treap
#include "bits/stdc++.h" using namespace std; inline int read(){ ,k=;char ch=getchar(); :, ...
- fhq Treap(无旋Treap)
先吹一波fhq dalao,竟然和我一个姓,我真是给他丢脸. 昨天treap就搞了一下午,感觉自己弱爆了.然后今天上午又看了一个上午的无旋treap再次懵逼,我太弱了,orzorz. 所以写个博客防止 ...
- 无旋treap的简单思想以及模板
因为学了treap,不想弃坑去学splay,终于理解了无旋treap... 好像普通treap没卵用...(再次大雾) 简单说一下思想免得以后忘记.普通treap因为带旋转操作似乎没卵用,而无旋tre ...
- 模板 - 数据结构 - 可持久化无旋Treap/PersistentFHQTreap
有可能当树中有键值相同的节点时,貌似是要对Split和Merge均进行复制的,本人实测:只在Split的时候复制得到了一个WA,但只在Merge的时候复制还是AC,可能是恰好又躲过去了.有人说假如确保 ...
- 洛谷 - P3391 【模板】文艺平衡树(Splay) - 无旋Treap
https://www.luogu.org/problem/P3391 使用无旋Treap维护序列,注意的是按顺序插入的序列,所以Insert实际上简化成直接root和Merge合并,但是假如要在序列 ...
- Luogu 3369 / BZOJ 3224 - 普通平衡树 - [无旋Treap]
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=3224 https://www.luogu.org/problemnew/show/P3 ...
- HNOI2012 永无乡 无旋Treap
题目描述 永无乡包含 nnn 座岛,编号从 111 到 nnn ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 nnn 座岛排名,名次用 111 到 nnn 来表示.某些岛之间由巨大的桥连接, ...
- 浅谈无旋treap(fhq_treap)
一.简介 无旋Treap(fhq_treap),是一种不用旋转的treap,其代码复杂度不高,应用范围广(能代替普通treap和splay的所有功能),是一种极其强大的平衡树. 无旋Treap是一个叫 ...
随机推荐
- js函数-构成
前言 函数是一种封装,在任何语言中都是一个核心概念.在js中,函数是做为对象的子类型存在的.可以拥有自己的属性和方法,可以做为值进行传递,这两个特性让js拥有使用函数式编程的能力. 函数的声明 字面量 ...
- Java 多线程高并发编程 笔记(二)
1. 单例模式(在内存之中永远只有一个对象) 1.1 多线程安全单例模式——不使用同步锁 public class Singleton { private static Singleton sin=n ...
- Python-11-循环
x = 1 while x <= 100: print(x) x += 1 基本上, 可迭代对象是可使用for循环进行遍历的对象. numbers = [0, 1, 2, 3 ...
- 2017EIS高校运维大赛ctf wirteup
php代码审计 题目很简单GET传入参数args然后eval(var_dump($$args))直接传入全局变量GLOBALS就能执行 php是最好的语言 .bak泄露拿到源码 <?php $v ...
- XML与JSON的区别
JSON和XML的比较 ◆可读性 JSON和XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负. ◆可扩展性 XML天生有很好的扩展性,JSON当然也有,没有什么是XML ...
- 线程池(3)Executors.newCachedThreadPool
例子: ExecutorService es = Executors.newCachedThreadPool(); try { for (int i = 0; i < 20; i++) { Ru ...
- (转)Module ngx_http_fastcgi_module
Example ConfigurationDirectives fastcgi_bind fastcgi_buffer_size fastcgi_buffering f ...
- c# 视频播放
发表于: 2003-10-15 20:39:21 搞定了,嘿嘿!首先非常感谢zoujiaming在邮件中给我指了条路:用C#调用API搞定!!!使用的是mciSendString API函数主要参考了 ...
- ThreadLocal源码解析,内存泄露以及传递性
我想ThreadLocal这东西,大家或多或少都了解过一点,我在接触ThreadLocal的时候,觉得这东西很神奇,在网上看了很多博客,也看了一些书,总觉得有一个坎跨不过去,所以对ThreadLoca ...
- JS判断android ios系统 PC端和移动端
最近公司上线移动端,需要根据不同的系统跳转到不同的产品页面,百度后发现这一段代码很好用,不但可以判断当前是什么系统,还能知道当前浏览器是什么内核,移动端PC端都已测试无问题! var browser ...