洛谷.3369.[模板]普通平衡树(fhq Treap)
第一次(2017.12.24):
#include<cstdio>
#include<cctype>
#include<algorithm>
//#define gc() getchar()
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
const int N=1e5+5,MAXIN=2e6;
char IN[MAXIN],*SS=IN,*TT=IN;
int size,sz[N],son[N][2],val[N],fix[N];
int New_Node(int v)
{
sz[++size]=1, val[size]=v, fix[size]=rand();
return size;
}
inline void Update(int rt)
{
sz[rt]=sz[son[rt][0]]+sz[son[rt][1]]+1;
}
void Split(int rt,int v,int &x,int &y)
{
if(!rt) x=y=0;
else
{
if(val[rt]<=v) x=rt,Split(son[rt][1],v,son[rt][1],y);
else y=rt,Split(son[rt][0],v,x,son[rt][0]);
Update(rt);
}
}
int Merge(int x,int y)
{
if(!x||!y) return x+y;
if(fix[x]<fix[y])
{
son[x][1]=Merge(son[x][1],y);
Update(x);
return x;
}
else
{
son[y][0]=Merge(x,son[y][0]);
Update(y);
return y;
}
}
int Kth(int rt,int k)
{
while(1)
{
if(sz[son[rt][0]]+1==k) return rt;
if(sz[son[rt][0]]<k) k-=sz[son[rt][0]]+1,rt=son[rt][1];
else rt=son[rt][0];
}
}
int Find(int rt,int w)
{
while(son[rt][w]) rt=son[rt][w];
return val[rt];
}
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
int main()
{
int q=read(),opt,v,x,y,z,root=0;
while(q--)
{
opt=read(),v=read();
switch(opt)
{
case 1: Split(root,v,x,y),root=Merge(Merge(x,New_Node(v)),y);//Insert
break;
case 2: Split(root,v,x,z),Split(x,v-1,x,y);//Delete
y=Merge(son[y][0],son[y][1]),root=Merge(Merge(x,y),z);
break;
case 3: Split(root,v-1,x,y),printf("%d\n",sz[x]+1);//Get_Rank
root=Merge(x,y);
break;
case 4: printf("%d\n",val[Kth(root,v)]);//Rank
break;
case 5: Split(root,v-1,x,y),printf("%d\n",val[Kth(x,sz[x])]);//printf("%d\n",Find(x,1));
root=Merge(x,y);//Precursor
break;
case 6: Split(root,v,x,y),printf("%d\n",val[Kth(y,1)]);//printf("%d\n",Find(y,0));
root=Merge(x,y);//Successor
break;
}
}
return 0;
}
第二次(2017.3.24):差不了太多。
//尴尬 rank没加1
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
const int N=1e5+5;
struct fhq_Treap
{
#define lson son[rt][0]
#define rson son[rt][1]
int tot,son[N][2],val[N],fix[N],sz[N];
inline int New_Node(int v){
sz[++tot]=1, fix[tot]=rand(), val[tot]=v;
return tot;
}
inline void Update(int rt){
sz[rt]=sz[lson]+sz[rson]+1;
}
int Merge(int x,int y)
{
if(!x||!y) return x^y;
if(fix[x]<fix[y])
{
son[x][1]=Merge(son[x][1],y);
Update(x);
return x;
}
else
{
son[y][0]=Merge(x,son[y][0]);
Update(y);
return y;
}
}
void Split(int rt,int v,int &x,int &y)
{
if(!rt) x=y=0;
else{
if(val[rt]<=v) x=rt,Split(rson,v,rson,y);
else y=rt,Split(lson,v,x,lson);
Update(rt);
}
}
int Kth(int k,int rt)
{
while(1)
{
if(sz[lson]<k && sz[lson]+1==k) return val[rt];
if(sz[lson]<k) k-=sz[lson]+1,rt=rson;
else rt=lson;
}
}
int Find(int rt,int w)
{
while(son[rt][w]) rt=son[rt][w];
return val[rt];
}
}t;
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
int main()
{
int q=read(),opt,val,x,y,z,root=0;
while(q--)
{
switch(opt=read(),val=read(),opt)
{
case 1: t.Split(root,val,x,y),root=t.Merge(t.Merge(x,t.New_Node(val)),y);
break;
case 2: t.Split(root,val,x,z),t.Split(x,val-1,x,y),
y=t.Merge(t.son[y][0],t.son[y][1]),root=t.Merge(t.Merge(x,y),z);
break;
case 3: t.Split(root,val-1,x,y),printf("%d\n",t.sz[x]+1),root=t.Merge(x,y);
break;
case 4: printf("%d\n",t.Kth(val,root));
break;
case 5: t.Split(root,val-1,x,y),printf("%d\n",t.Find(x,1)/*t.Kth(sz[x],x)*/),root=t.Merge(x,y);
break;
case 6: t.Split(root,val/*以val分..*/,x,y),printf("%d\n",t.Find(y,0)),root=t.Merge(x,y);
break;
}
}
return 0;
}
第三次写(2018.4.4):
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
const int N=1e5+5;
inline int read()
{
int now=0,f=1;register char c=gc();
for(;!isdigit(c);c=gc()) if(c=='-') f=-1;
for(;isdigit(c);now=now*10+c-'0',c=gc());
return now*f;
}
namespace fhq_Treap
{
#define lson son[rt][0]
#define rson son[rt][1]
int tot,fa[N],son[N][2],sz[N],val[N],fix[N];
inline int New_Node(int v){
fix[++tot]=rand(), val[tot]=v, sz[tot]=1;
return tot;
}
inline void Update(int rt){
sz[rt]=sz[lson]+sz[rson]+1;
}
void Split(int rt,int v,int &x,int &y)
{
if(!rt) x=y=0;
else{
if(val[rt]<=v) x=rt,Split(rson,v,rson,y);//val[rt] not val[x]..
else y=rt,Split(lson,v,x,lson);
Update(rt);
}
}
int Merge(int x,int y)
{
if(!x||!y) return x^y;
if(fix[x]<fix[y]){
son[x][1]=Merge(son[x][1],y), Update(x);
return x;
}
else{
son[y][0]=Merge(x,son[y][0]), Update(y);
return y;
}
}
int Rank(int k,int rt)
{
while(1)
{
if(sz[lson]+1==k) return rt;
if(sz[lson]<k) k-=sz[lson]+1,rt=rson;
else rt=lson;
}
}
int Find(int rt,int w)
{
while(son[rt][w]) rt=son[rt][w];
return rt;
}
}
using namespace fhq_Treap;
int main()
{
int n=read(),opt,v,x,y,z,root=0;
while(n--)
switch(opt=read(),v=read(),opt)
{
case 1: Split(root,v,x,y),x=Merge(x,New_Node(v)),root=Merge(x,y);
break;
case 2: Split(root,v,x,z),Split(x,v-1,x,y),y=Merge(son[y][0],son[y][1]),root=Merge(Merge(x,y),z);
break;
case 3: Split(root,v-1,x,y),printf("%d\n",sz[x]+1),root=Merge(x,y);
break;
case 4: printf("%d\n",val[Rank(v,root)]);
break;
case 5: Split(root,v-1,x,y),printf("%d\n",val[Find(x,1)]),root=Merge(x,y);
break;
case 6: Split(root,v,x,y),printf("%d\n",val[Find(y,0)]),root=Merge(x,y);
break;
}
return 0;
}
洛谷.3369.[模板]普通平衡树(fhq Treap)的更多相关文章
- 洛谷.3369.[模板]普通平衡树(Splay)
题目链接 第一次写(2017.11.7): #include<cstdio> #include<cctype> using namespace std; const int N ...
- 洛谷.3391.[模板]文艺平衡树(Splay)
题目链接 //注意建树 #include<cstdio> #include<algorithm> const int N=1e5+5; //using std::swap; i ...
- 在洛谷3369 Treap模板题 中发现的Splay详解
本题的Splay写法(无指针Splay超详细) 前言 首先来讲...终于调出来了55555...调了整整3天..... 看到大部分大佬都是用指针来实现的Splay.小的只是按照Splay的核心思想和原 ...
- 2021.12.08 平衡树——FHQ Treap
2021.12.08 平衡树--FHQ Treap http://www.yhzq-blog.cc/fhqtreapzongjie/ https://www.cnblogs.com/zwfymqz/p ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- (treap)[bzoj3224][洛谷3369][cogs1829]Tyvj 1728 普通平衡树
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:1. 插入x数2. 删除x数(若有多个相同的数,因只删除一个)3. 查询x数的排名(若有多个相同的数 ...
- Luogu P3835 【模板】可持久化平衡树(fhq Treap)
P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本 ...
- 洛谷P3380 二逼平衡树
线段树+平衡树 我!又!被!卡!常!了! 以前的splay偷懒的删除找前驱后继的办法被卡了QAQ 放一个在洛谷开O2才能过的代码..我太菜了.. #include <bits/stdc++.h& ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
随机推荐
- Kali安装问题解决方案
一.对今天安装Kalilinux 失败的原因做一个简单的总结, 1.安装之前的电脑状况,电脑配置Windows7 64位旗舰版配置,虚拟版本是VMware Workstation Pro14 ver ...
- HTML&javaSkcript&CSS&jQuery&ajax(八)
一. <!DOCTYPE html><html><head><meta charset="utf-8"><tiitle> ...
- Nginx详解二十七:Nginx架构篇之安全篇
1.常见的恶意行为:爬虫行为和恶意抓取.资源盗用 解决方案: 基础防盗链功能:不让恶意用户能轻易爬去网站对外数据 secure_link_module模块:对数据安全性提高,加密验证和失效性,适合核心 ...
- Android Studio 配置虚拟设备的镜像文件的存放路径
操作系统:Windows 10 x64 IDE:Android Studio 3.3 Android Studio创建的虚拟设备的默认存放路径是位于C盘,这导致C盘的可用容量变小. 所以,我决定要将虚 ...
- python基础复习
复习-基础 一.review-base 其他语言吗和python的对比 c vs Python c语言是python的底层实现,解释器就是由python编写的. c语言开发的程序执行效率高,开发现率低 ...
- 泛微云桥e-Bridge安装手册
有时候不看官方文档进行配置,可能会出现奇奇怪怪的问题,SO转载一下官方文档,顺带学习. 想超长体验此软件,请搜索本博客内容,有破解方法,仅用来学习使用,顺带进行二次开发,请勿使用在商业用途,谢谢. 泛 ...
- SqlServer 四大排名函数(ROW_NUMBER、RANK、DENSE_RANK、NTILE)简介
CREATE TABLE [dbo].[Order]( [ID] [int] IDENTITY(1,1) NOT NULL, [UserId] [int] NOT NULL, [TotalPrice] ...
- python---自己来打通节点,链表,栈,应用
但,, 没有调试通过. 思路是对的,立此存照. 关键就是用链表完全实现列表的功能, 替换了就应该OK的. # coding = utf-8 # 节点初始化 class Node: def __init ...
- Quartz.net入门
简介 Quartz.NET是一个开源的作业调度框架,是OpenSymphony的 Quartz API的.NET移植,它用C#写成,可用于winform和asp.net应用中.它提供了巨大的灵活性而不 ...
- 优化 Markdown 在 Notepad++ 中的使用体验
选择一个强大而好用的文本编辑器,是进行 Web 开发和编程必不可少的一部分,甚至对于通常的写作,一个舒服的文本编辑器也会让你写起文字来觉得优雅而潇洒.Sublime Text 是一款不错的编辑器,简洁 ...