普通平衡树,模板的不能再模板的模板题。我调了两个小时。。。

早先看yyb大神的blog学习splay,看的风生水起然而没有发现,大神的坑没有填……没有rank操作和k_th操作。

只能自己摸索,问问大佬。

yzh巨佬拨冗花了五分钟给我解释清楚了k_th和rank求得东西是不去重的(用拙劣的语言表达大神高超的技巧,诸位勿喷)并且给我讲明白了size的各种操作以及妙用后我就再也不会把cnt和size写混了,就回去自己写。

和同桌lyl大佬一起写完,一起T10……然后lyl大佬果断在平衡树中插入了inf和-inf(#define inf 0x7fffffff),A掉了,直降7000毫。

蒟蒻颓了lyl大佬的想法也加了这么个东西,顺手改了一下k_th的求法,W20绝望。

因为和lyl大佬看的同一份模板,我们对了一下各个函数,发现写的一毛一样。绝望+1。

去找调代码专家ooo巨佬对了一遍,完全一样。绝望+999。

最后找到了动动神佬,动动神佬花了三分钟找到了错误:查前驱的时候一个变量名写错了…… /一脸复杂 /生无可恋 /死掉算了

罚自己默写三遍splay模板

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#define read(a) a=init()
using namespace std;
struct node{
long long fa,ch[2],data,size,cnt;
}t[10000003];
long long n,root=0,tot=0,lei,thi;
inline long long init()
{
long long a=0,b=1;char ch=getchar();
while(ch>'9'||ch<'0'){if(ch=='-')b=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){a=(a<<3)+(a<<1)+(ch-'0');ch=getchar();}
return a*b;
}
inline void rotate(long long x)
{
long long y=t[x].fa;
long long z=t[y].fa;
long long k=t[y].ch[1]==x;
t[z].ch[t[z].ch[1]==y]=x;
t[x].fa=z;
t[y].ch[k]=t[x].ch[k^1];
t[t[x].ch[k^1]].fa=y;
t[x].ch[k^1]=y;
t[y].fa=x;
t[y].size=t[t[y].ch[0]].size+t[t[y].ch[1]].size+t[y].cnt;
t[x].size=t[t[x].ch[0]].size+t[t[x].ch[1]].size+t[x].cnt;
}
inline void splay(long long x,long long goal)
{
while(t[x].fa!=goal)
{
long long y=t[x].fa,z=t[y].fa;
if(z!=goal)
(t[y].ch[0]==x)^(t[z].ch[0]==y)?rotate(x):rotate(y);
rotate(x);
}
if(!goal)root=x;
}
inline void insert(long long x)
{
long long u=root;
long long ff=0;
while(u&&x!=t[u].data)
{
ff=u;
u=t[u].ch[x>t[u].data];
}
if(u)
t[u].cnt++;
else
{
u=++tot;
if(ff)t[ff].ch[x>t[ff].data]=u;
t[u].fa=ff;
t[u].ch[0]=t[u].ch[1]=0;
t[u].size=1;
t[u].data=x;
t[u].cnt=1;
}
splay(u,0);
}
inline void find(long long x)
{
long long u=root;
if(!u)return ;
while(t[u].ch[x>t[u].data]&&x!=t[u].data)
u=t[u].ch[x>t[u].data];
splay(u,0);
}
inline long long nxt(long long x,long long f)
{
find(x);
long long u=root;
if(t[u].data>x&&f)return u;
if(t[u].data<x&&!f)return u;
u=t[u].ch[f];
while(t[u].ch[f^1])u=t[u].ch[f^1];
return u;
}
inline void delet(long long x)
{
long long last=nxt(x,0);
long long next=nxt(x,1);
splay(last,0);
splay(next,last);
long long del=t[next].ch[0];
if(t[del].cnt>1)
{
t[del].cnt--;
splay(del,0);
}
else t[next].ch[0]=0;
}
inline long long rnk(long long x)
{
find(x);
return t[t[root].ch[0]].size;
}
inline long long k_th(long long x)
{
long long u=root;
if(t[u].size<x)return 0;
while(1)
{
int y=t[u].ch[0];
if(x>t[y].size+t[u].cnt)
{
x-=t[y].size+t[u].cnt;
u=t[u].ch[1];
}
else
if(t[y].size>=x)u=y;
else return t[u].data;
}
}
int main()
{
read(n);
insert(0x7fffffff);
insert(-0x7fffffff);
for(register long long i=1;i<=n;++i)
{
read(lei),read(thi);
switch(lei)
{
case 1:{
insert(thi);
break;
}
case 2:{
delet(thi);
break;
}
case 3:{
printf("%lld\n",rnk(thi));
break;
}
case 4:{
printf("%lld\n",k_th(thi+1));
break;
}
case 5:{
printf("%lld\n",t[nxt(thi,0)].data);
break;
}
case 6:{
printf("%lld\n",t[nxt(thi,1)].data);
break;
}
}
}
return 0;
}

日常[splay]:水题记——普通平衡树(死亡调试)的更多相关文章

  1. 日常[splay]:水题记——营业额统计

    没错这就是让我深陷splay之中的罪魁祸首,昨天打了一下午结果发现是玄学错误的那个 人生第一棵splay平衡树 题目大意:求一段序列,小于当前元素的最大值和大于当前元素的最小值.从该元素前面的元素找. ...

  2. [日常摸鱼]bzoj3224普通平衡树-Treap、Splay、01Trie、替罪羊树…

    http://www.lydsy.com/JudgeOnline/problem.php?id=3224 经典的平衡树模板题-各种平衡树好像都可以(黄学长之前好像还用vector卡过了这题) 所以这篇 ...

  3. 【Splay】bzoj3223-Tyvj1729文艺平衡树

    一.题目 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4]的话,结果是5 ...

  4. 51nod水题记

    妈呀51nod已经刷不动了又开始跟bzoj一样总是得看题解了...那么发一下总结吧... 1051:最大子矩阵 #include<cstdio> #include<cstring&g ...

  5. [日常] windows下使用vscode配合xebug调试php脚本

    windows下使用vscode配合xebug调试php脚本 要下载有php_xebug.dll扩展的版本,最新版可能没有这个扩展,php7.3应该是有的,php7.3.4好像没有默认是不加载这个扩展 ...

  6. NOIp 0924 水题记

    这场貌似是gcd专场? 第一题很有意思,模拟gcd的过程即可. //0924 candy //by Cydiater //2016.9.24 #include <iostream> #in ...

  7. P3391 文艺平衡树(Splay)

    题目背景 这是一道经典的Splay模板题--文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

  8. 洛谷 P3391 【模板】文艺平衡树(Splay)

    题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

  9. BZOJ3223 文艺平衡树(splay)

    题目背景 这是一道经典的Splay模板题——文艺平衡树. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1, ...

随机推荐

  1. k8s-RBAC授权-十六

    一.简介 基于角色的访问控制(“RBAC”) http://docs.kubernetes.org.cn/80.html (1) Kubernetes的授权是基于插件形式的,常用的授权插件有以下几种: ...

  2. CodeForces 719A Vitya in the Countryside (水题)

    题意:根据题目,给定一些数字,让你判断是上升还是下降. 析:注意只有0,15时特别注意一下,然后就是14 15 1 0注意一下就可以了. 代码如下: #pragma comment(linker, & ...

  3. hdoj3711【水】

    题意: 给你两个集合,对于每个B集合的元素,从A集合找一个数使得a^b的二进制的1个数最少. 思路: 直接搞= = #include <bits/stdc++.h> using names ...

  4. hdoj5115【区间DP·基础】

    题意: 有n头wolf排成一排,杀一头wolf回受到受到的伤害=它的本身a[i]+相邻两个b[i-1]+b[i+1].然后杀死第k个位置的wolf的话,k-1和k+1默认相邻(满足的话). 思路: 用 ...

  5. poj1163 【记忆化搜索·水】

    题意: 一个这样的三角形,他可以往下的左或者往下的右走.求一个在最后一行的最大. 思路: 额...就是搜一下..记录一下...肯定有重合的情况. code- //#include <bits/s ...

  6. Unity3D将来时:IL2CPP(上)

    http://inpla.net/thread-8197-1-1.html Unity3D将来时:IL2CPP(上) (注:本文详细的讲述了C#,Mono,.Net, IL等Unity使用到的概念,如 ...

  7. UVA - 11552 Fewest Flops

    传送门: 题目大意:给你一个字符串,可以平均分成很多段,每一段之内的元素可以任意排序,最后再按原来的顺序把每一段拼起来,问最少的块数.(块:连续相同的一段字符成为一个块) 题解: 首先我们可以发现,每 ...

  8. Ubuntu 设置文件默认打开的应用

    右键单击该文件,然后点击属性,打开属性面板 然后进入open with的选项,选择应用后,点击 set as default

  9. hdu 3172 Virtual Friends (字符串的并查集)

    一开始一直wa,因为第一个数字t也是多组输入. 然后一直超时,因为我用的是C++里面的cin,所以非常耗时,几乎比scanf慢了10倍,但是加上了一个语句后: std::ios::sync_with_ ...

  10. python中时间日期格式化符号的含义

    %y   两位数的年份表示(00-99) %Y 四位数的年份表示(000-9999) %m 月份(01-12) %d 月内中的一天(0-31) %H    24小时制小时数(0-23) %I   12 ...