鬼子进村 fhq-treap

题面

观察题目发现可用平衡树做:每次鬼子拆家即从平衡树中加入被拆的节点;每次村民修房子都向平衡树中删除该节点;每次查询时,只需要求出其后驱与前驱,易知nxt-pre-1为答案。

使用\(\text{fhq-treap}\)实现平衡树部分

#include <cstdio>
#include <cstdlib>
#define MAXN 50005
using namespace std;
struct nod{
int sl,sr,val,rnd,sz;
} tre[MAXN];
void update(int x){
tre[x].sz=1+tre[tre[x].sl].sz+tre[tre[x].sr].sz;
}
int merge(int x, int y){
if(x==0||y==0) return x|y;
if(tre[x].rnd<tre[y].rnd){
tre[x].sr=merge(tre[x].sr, y);
update(x);
return x;
}else{
tre[y].sl=merge(x, tre[y].sl);
update(y);
return y;
}
}
void split(int cur, int k, int &x, int &y){
if(cur==0){x=y=0; return;}
if(tre[cur].val<=k){
x=cur;
split(tre[cur].sr, k, tre[cur].sr, y);
}else{
y=cur;
split(tre[cur].sl, k, x, tre[cur].sl);
}
update(cur);
}
int tot,rot,x,y,z;
int new_nod(int val){
tre[++tot].val=val;
tre[tot].sz=1;
tre[tot].rnd=rand();
return tot;
}
void add(int val){
split(rot, val, x, y);
rot=merge(merge(x, new_nod(val)), y);
}
void del(int val){
split(rot, val, x, z);
split(x, val-1, x, y);
y=merge(tre[y].sl, tre[y].sr);
rot=merge(merge(x, y), z);
}
int get_kth(int cur, int k){
while(1){
if(k<=tre[tre[cur].sl].sz) cur=tre[cur].sl;
else if(k==tre[tre[cur].sl].sz+1) return cur;
else k-=tre[tre[cur].sl].sz+1, cur=tre[cur].sr;
}
}
int get_pre(int val){
split(rot, val-1, x, y);
int res=get_kth(x, tre[x].sz);
rot=merge(x,y);
return res;
}
int get_nxt(int val){
split(rot, val, x, y);
int res=get_kth(y, 1);
rot=merge(x,y);
return res;
}
int n,m;
int s[MAXN],top;
bool des[MAXN];
int main(){
srand((unsigned)19270817);
scanf("%d %d", &n, &m);
add(0),add(n+1);
while(m--){
char opt;int t;
scanf("\n%c ", &opt);
if(opt=='D'){
scanf("%d", &t);
add(t);
s[++top]=t;
des[t]=1;
}else if(opt=='Q'){
scanf("%d", &t);
if(des[t]) printf("0\n");
else printf("%d\n", tre[get_nxt(t)].val-tre[get_pre(t)].val-1);
}else if(opt=='R'){
while(des[s[top]]==0) ++top;
des[s[top]]=0;
del(s[top--]);
}else puts("Erro!");
}
return 0;
}

鬼子进村 fhq-treap的更多相关文章

  1. fhq treap最终模板

    新学习了fhq treap,厉害了 先贴个神犇的版, from memphis /* Treap[Merge,Split] by Memphis */ #include<cstdio> # ...

  2. NOI 2002 营业额统计 (splay or fhq treap)

    Description 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况. Tiger拿出了公司的账本,账本上记录了公司成立以来每 ...

  3. 【POJ2761】【fhq treap】A Simple Problem with Integers

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  4. 【fhq Treap】bzoj1500(听说此题多码上几遍就能不惧任何平衡树题)

    1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 15112  Solved: 4996[Submit][Statu ...

  5. 「FHQ Treap」学习笔记

    话说天下大事,就像fhq treap —— 分久必合,合久必分 简单讲一讲.非旋treap主要依靠分裂和合并来实现操作.(递归,不维护fa不维护cnt) 合并的前提是两棵树的权值满足一边的最大的比另一 ...

  6. FHQ Treap摘要

    原理 以随机数维护平衡,使树高期望为logn级别 不依靠旋转,只有两个核心操作merge(合并)和split(拆分) 因此可持久化 先介绍变量 ; int n; struct Node { int v ...

  7. FHQ Treap小结(神级数据结构!)

    首先说一下, 这个东西可以搞一切bst,treap,splay所能搞的东西 pre 今天心血来潮, 想搞一搞平衡树, 先百度了一下平衡树,发现正宗的平衡树写法应该是在二叉查找树的基础上加什么左左左右右 ...

  8. 在平衡树的海洋中畅游(四)——FHQ Treap

    Preface 关于那些比较基础的平衡树我想我之前已经介绍的已经挺多了. 但是像Treap,Splay这样的旋转平衡树码亮太大,而像替罪羊树这样的重量平衡树却没有什么实际意义. 然而类似于SBT,AV ...

  9. 浅谈fhq treap

    一.简介 fhq treap 与一般的treap主要有3点不同 1.不用旋转 2.以merge和split为核心操作,通过它们的组合实现平衡树的所有操作 3.可以可持久化 二.核心操作 代码中val表 ...

  10. fhq treap 学习笔记

    序 今天心血来潮,来学习一下fhq treap(其实原因是本校有个OIer名叫fh,当然不是我) 简介 fhq treap 学名好像是"非旋转式treap及可持久化"...听上去怪 ...

随机推荐

  1. nacos搭建

    1.下载执行包 直接官网 https://nacos.io/zh-cn/docs/quick-start.html 2. 建表 3. 启动 http://10.0.0.113:8848/nacos/i ...

  2. (八)Struts标签基础(一)

    一.Struts标签分类 二.标签的使用 2.1 标签的主题 主题的设置与struts.xml中的常量<constant name="struts.ui.theme" val ...

  3. HashSet和CopyOnWriteArraySet(转载)

    前言 这篇文章的目的如下: HashSet是如何保证元素的不重复和无序 HashSet的增删(改查?)原理 CopyOnWriteArraySet支持并发的原理 CopyOnWriteArraySet ...

  4. restTemplate源码解析(五)处理ClientHttpResponse响应对象

    所有文章 https://www.cnblogs.com/lay2017/p/11740855.html 正文 上一篇文章中,我们执行了ClientHttpRequest与服务端进行交互.并返回了一个 ...

  5. 使用Lua编写Wireshark插件解析KCP UDP包,解析视频RTP包

    前段时间写了一个局域网音视频通话的程序,使用开源 KCP 来实现可靠UDP传输. 通过研究发现KCP在发包时,会在数据包前面加上它自己的头.如果数据包较小,KCP可能会把多个数据包合成一个包发送,提高 ...

  6. Css制作table细线表格

    制作细线表格,我想应该是最基本的css知识了,记录下来巩固下. 推荐: table{ border-collapse:collapse; border: 1px solid #000000; } td ...

  7. gradient 渐变

    看了大漠 写的关于 Gradient 的文章,我也想写点以便加深记忆. 首先gradient 分为linear-gradient (线性渐变) 和 radial-gradient(径向渐变),渐变是作 ...

  8. iOS-OC中常见的一些宏

    /* 1. 颜色 */ #define PCBRGBColorA(r, g, b, a) [UIColor colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b ...

  9. 开发六年mybatisplus使用小结

    最近在项目里用到了一个第三方库,叫mybatisplus,是一个mybatis的增强库,简单来说就是增强了mybatis的功能,让mybatis更好用,mybatisplus给的官方定义是Mybati ...

  10. DNS zone file

    zone file格式最初由Berkeley Internet Name Domain(BIND)软件包使用,但已被其他DNS server software广泛采用.它们中的一些(例如NSD,Pow ...