指针是个好东西

不过就是得判空

还有别忘传引用(其实应该都传引用)

#include<cstdio>
#include<algorithm>
#include<iostream>
using namespace std;
int inf=0x7fffffff;
struct node* nil;
struct node
{
int num;
int val;
int size;
node* ch[2];
node (int v) :val(v)
{
size=1;
num=1;
ch[0]=ch[1]=nil;
}
void sum()
{
size=num;
if(ch[0]!=nil)
size+=ch[0]->size;
if(ch[1]!=nil)
size+=ch[1]->size;
return ;
}
int cmp(int v)
{
if(val==v)
return -1;
return (val>v ? 0 : 1);
}
int cmpkth(int k)
{
int s=( ch[0]==nil ? 0 : ch[0]->size );
if(k>s&&k<=s+num)
return -1;
if(k<=s)
return 0;
else
return 1;
}
};
node* root;
void visit(node* x)
{
if(x==nil)
return ;
visit(x->ch[0]);
printf("%d ",x->val);
visit(x->ch[1]);
return ;
}
void rotato(node* &x,int base)
{
node* k=x->ch[base^1];
x->ch[base^1]=k->ch[base];
k->ch[base]=x;
x->sum();
k->sum();
x=k;
}
void splay(node* &x,int v)
{
int d=x->cmp(v);
if(d!=-1&&x->ch[d]!=nil)
{
int d2=x->ch[d]->cmp(v);
if(d2!=-1&&x->ch[d]->ch[d2]!=nil)
{
splay(x->ch[d]->ch[d2],v);
if(d==d2)
rotato(x,d2^1),rotato(x,d^1);
else
rotato(x->ch[d],d2^1),rotato(x,d^1);
}
else
rotato(x,d^1);
}
}
void splaykth(node* &x,int k)
{
int d=x->cmpkth(k);
if(d!=-1)
{
if(d==1)
k=k-x->ch[0]->size-x->num;
int d2=x->ch[d]->cmpkth(k);
if(d2!=-1)
{
int k2=(d2==1 ? k-x->ch[d]->ch[0]->size-x->ch[d]->num : k);
splaykth(x->ch[d]->ch[d2],k2);
if(d==d2)
rotato(x,d2^1),rotato(x,d^1);
else
rotato(x->ch[d],d2^1),rotato(x,d^1);
}
else
rotato(x,d^1);
}
return ;
}
void pre(node* x,int val,int &ans)
{
if(x==nil)
return ;
if(x->val<val)
{
if(x->val>ans)
ans=x->val;
if(x->ch[1]!=nil)
pre(x->ch[1],val,ans);
}
else
if(x->val>=val&&x->ch[0]!=nil)
pre(x->ch[0],val,ans);
}
void nxt(node* x,int val,int &ans)
{
if(x==nil)
return ;
if(x->val>val)
{
if(x->val<ans)
ans=x->val;
if(x->ch[0]!=nil)
nxt(x->ch[0],val,ans);
}
else
if(x->val<=val&&x->ch[1]!=nil)
nxt(x->ch[1],val,ans);
}
int find(node* &x,int val)
{
splay(x,val);
return x->ch[0]->size+1;
}
int kth(node* &x,int k)
{
splaykth(x,k);
return x->val;
}
node *spilt(node* &x,int val)
{
if(x==nil)
return nil;
splay(x,val);
node* t1;
node* t2;
if(x->val<=val)
t1=x,t2=x->ch[1],t1->ch[1]=nil;
else
t2=x,t1=x->ch[0],t2->ch[0]=nil;
x->sum();
x=t1;
return t2;
}
void merge(node* &t1,node* &t2)
{
if(t1==nil)
swap(t1,t2);
splay(t1,inf);
t1->ch[1]=t2;
t2=nil;
t1->sum();
}
void insert(node* &x,int val)
{
//visit(x);printf("\n");
node* t2=spilt(x,val);
//visit(x);printf("\n");
if(x!=nil&&x->val==val)
{
x->num+=1;
x->sum();
}
else
{
node* nw=new node(val);
merge(x,nw);
}
merge(x,t2);
//visit(root);printf("\n");
}
void erase(node* &x,int val)
{
node* t2=spilt(x,val);
x->num-=1;
if(x->num==0)
{
node* t3=x;
x=x->ch[0];
delete t3;
}
merge(x,t2);
}
int read()
{
int s=0,f=1;
char in=getchar();
while(in<'0'||in>'9')
{
if(in=='-')
f=-1;
in=getchar();
}
while(in>='0'&&in<='9')
{
s=(s<<1)+(s<<3)+in-'0';
in=getchar();
}
return s*f;
}
int main()
{
int n=read();
int a,b;
int ans;
nil=new node(0);
root=nil->ch[0]=nil->ch[1]=nil;
nil->size=nil->num=0;
for(int i=1;i<=n;i++)
{
a=read();
b=read();
switch(a)
{
case 1: insert(root,b);break;
case 2: erase(root,b);break;
case 3: printf("%d\n",find(root,b));break;
case 4: printf("%d\n",kth(root,b));break;
case 5: insert(root,b);ans=-0x7fffffff;pre(root,b,ans);printf("%d\n",ans);erase(root,b);break;
case 6: insert(root,b);ans=0x7fffffff;nxt(root,b,ans);printf("%d\n",ans);erase(root,b);break;
default: break;
}
}
return 0;
}

splay版的更多相关文章

  1. 【POJ3580】【splay版】SuperMemo

    Description Your friend, Jackson is invited to a TV show called SuperMemo in which the participant i ...

  2. [P3369]普通平衡树(Splay版)

    模板,不解释 #include<bits/stdc++.h> using namespace std; const int mxn=1e5+5; int fa[mxn],ch[mxn][2 ...

  3. bzoj1861 书架 splay版

    单点插入删除以及求前缀 #include<cstdio> #include<cstring> #include<algorithm> using namespace ...

  4. bzoj1503 郁闷的出纳员 splay版

    自己yy的写法 可能有点奇怪吧 详情看代码 还是蛮短的 #include<cstdio> #include<cstring> #include<algorithm> ...

  5. AC日记——营业额统计 codevs 1296 (splay版)

    营业额统计 思路: 每次,插入一个点: 然后找前驱后继: 来,上代码: #include <cmath> #include <cstdio> #include <iost ...

  6. 数列[专杀Splay版]

    时间限制: 3 Sec  内存限制: 128 MB提交: 49  解决: 7 题目描述 输入一个数列,你需要进行如下操作:  1. 把编号为I的数值改为K  2. 输出从小到大排序后第k个数 输入 输 ...

  7. 牛客网多校训练第三场 C - Shuffle Cards(Splay / rope)

    链接: https://www.nowcoder.com/acm/contest/141/C 题意: 给出一个n个元素的序列(1,2,...,n)和m个操作(1≤n,m≤1e5),每个操作给出两个数p ...

  8. BZOJ2028:[SHOI2009]会场预约(平衡树版)

    浅谈\(splay\):https://www.cnblogs.com/AKMer/p/9979592.html 浅谈\(fhq\)_\(treap\):https://www.cnblogs.com ...

  9. P3369 【模板】普通平衡树(Treap/SBT)

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询 ...

随机推荐

  1. component: resolve => require(['../pages/home.vue'], resolve)

    component: resolve => require(['../pages/home.vue'], resolve) vue 路由的懒加载 import Vue from 'vue' im ...

  2. Unity Screen Screen.currentResolution 当前分辨率

    The current screen resolution (Read Only). 当前屏幕的分辨率.(只读) If the player is running in window mode, th ...

  3. (转)TCP连接的11种状态变迁

    自:http://blog.csdn.net/engrossment/article/details/8104482 http://blog.csdn.net/xiaofei0859/article/ ...

  4. (转)mysql5.6.7多实例安装、配置的详细讲解分析及shell启动脚本的编写

    一.mysql安装 1.下载mysql数据库源码包: wget http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.27.tar.gz 2.安装mys ...

  5. jQuery OCUpload一键上传文件

    1 引入相关的js文件 <!--引入OCUpload的js文件,之前需要引入jQuery的js文件 --> <script type="text/javascript&qu ...

  6. 在Java中VO , PO , BO , QO, DAO ,POJO是什么意思

    在Java中VO , PO , BO, DAO ,POJO是什么意思 最近在项目中,遇到VO,我的天...那就一起学习回忆一下 首先简单说明下: O/R  Mapping是Object Relatio ...

  7. StreamReader类

    StreamReader类用于从文件中读取数据,该类是一个通用类,可用于任何流,构造方法和StreamWrite类格式一样的. 创建方式有两种: 1.先创建Filestream类在创建StreamRe ...

  8. maven课程 项目管理利器-maven 3-10 maven聚合和继承 4星

    本节主要讲了以下内容: 1 maven聚合 2 maven继承 1 maven聚合 <!-- 聚合特有标签 --> <groupId>com.hongxing</grou ...

  9. 处理http请求时,如何处理url的参数

    1.@PathVariable 获取url中的数据 这种写法显得简洁 也可以把参数写在前面 @RequestParam 获取请求参数的值 适合传统的get提交参数的获取 给参数id设置一个默认值 不传 ...

  10. webpack打包将配置文件单独抽离不压缩打包

    webpack.config.js: plugins: [ //提取公共模块 new webpack.optimize.CommonsChunkPlugin({ name: 'vendors', ch ...