自己yy的Splay
#include <iostream>
#include <cstdio>
#include <queue>
using namespace std; const int maxn=1e5+;
struct Node{
int val,rev,max,min;
Node(){}
Node(int _rev,int _max,int _min){
this->rev=_rev;
this->max=_max;
this->min=_min;
}
};
Node node[maxn];
int son[maxn][];//0 表示左儿子,1表示右儿子
int father[maxn];
bool Root[maxn];
int ROOT;
int tot;
int n,q,op;
struct bnode{
int v,dep;
bnode(int _v,int _dep){
this->v=_v;
this->dep=_dep;
}
};
vector<int> DEEP[maxn];
void init(){
tot=;
ROOT=-;
memset(Root,,sizeof(Root));
}
void BFS(){
int i;
for(i=;i<maxn;++i){
DEEP[i].clear();
}
if(ROOT==-) return;
queue<bnode> que;
que.push(bnode(ROOT,));
while(!que.empty()){
bnode t=que.front();
que.pop();
int v=t.v;
int dep=t.dep;
DEEP[dep].push_back(v);
if(son[v][]!=) que.push(bnode(son[v][],dep+));
if(son[v][]!=) que.push(bnode(son[v][],dep+));
}
}
void print(){
BFS();
int cnt=;
for(int j=;j<;++j){
if(DEEP[j].size()==) break;
cnt++;
printf("DEEP:%d==>",j);
for(int k=;k<DEEP[j].size();++k){
printf("%d ",DEEP[j][k]);
}
printf("\n");
}
if(!cnt) printf("The Tree is Empty\n");
}
void printVAL(){
int i;
for(i=;i<tot;++i){
printf("v%d val%d leftson%d rightson%d fa%d\n",i,node[i].val,son[i][],son[i][],father[i]);
}
}
void zig(int x){
int y=father[x];
int z=father[y];
son[y][]=son[x][];
if(son[x][]!=)
father[son[x][]]=y;
son[x][]=y;
if(y!=)
father[y]=x;
if(x!=)
father[x]=z;
if(z!=-&&z!=){
if(son[z][]==y){
son[z][]=x;
}
else {
son[z][]=x;
}
}
if(Root[y]){
Root[x]=true;
Root[y]=false;
ROOT=x;
}
}
void zag(int x){
int y=father[x];
int z=father[y];
son[y][]=son[x][];
if(son[x][])
father[son[x][]]=y;
son[x][]=y;
if(y)
father[y]=x;
if(x)
father[x]=z;
if(z!=-&&z!=){
if(son[z][]==y){
son[z][]=x;
}
else{
son[z][]=x;
}
}
if(Root[y]){
Root[x]=true;
Root[y]=false;
ROOT=x;
}
}
void zigzig(int x){
int y=father[x];
zig(y);
zig(x);
}
void zagzag(int x){
int y=father[x];
zag(y);
zag(x);
}
void zigzag(int x){
zig(x);zag(x);
}
void zagzig(int x){
zag(x);zig(x);
}
void Splay(int x){
while(!Root[x]){
int y=father[x];
int z=father[y];
if(z!=-&&!Root[z]){
if(son[z][]==y){
if(son[y][]==x){
zigzig(x);
}
else{
zag(x);zig(x);
}
}
if(son[z][]==y){
if(son[y][]==x){
zagzag(x);
}
else{
zig(x);zag(x);
}
}
}
else if(!Root[y]){
if(son[y][]==x){
zig(x);
}
else{
zag(x);
}
}
else {
if(son[y][]==x){
zig(x);
}
else {
zag(x);
}
}
// printf("==========\n");
// print();
// printVAL();
}
} int insert(int rt,int x){
if(rt==-){
rt=tot;
node[rt].val=x;
father[rt]=-;
Root[rt]=true;
ROOT=rt;
++tot;
return tot-;
}
if(x>node[rt].val){
if(son[rt][]==){
node[tot].val=x;
father[tot]=rt;
son[rt][]=tot;
tot++;
return tot-;
}
else insert(son[rt][],x);
}
else if(x<node[rt].val){
if(son[rt][]==){
node[tot].val=x;
father[tot]=rt;
son[rt][]=tot;
tot++;
return tot-;
}
else insert(son[rt][],x);
}
} int Search(int rt,int x){
// printf("rt%d x%d\n",rt,x);
if(rt==-){
//Exception
}
if(x==node[rt].val){
Splay(rt);
return rt;
}
if(x>node[rt].val){
if(son[rt][]==) return -;
return Search(son[rt][],x);
}
else if(x<node[rt].val){
if(son[rt][]==) return -;
return Search(son[rt][],x);
}
}
int SearchMax(int rt){
if(son[rt][]!=){
int x=son[rt][];
if(son[x][]==) return x;
return SearchMax(son[x][]);
}
return rt;
}
bool Delete(int x){
int id=Search(ROOT,x);
if(id==-) return false;
Splay(id);
// print();
// printf("=======\n");
int left=son[id][];
int right=son[id][];
son[id][]=;
son[id][]=;
if(left)
father[left]=-;
if(right)
father[right]=-;
Root[id]=false;
if(left)
Root[left]=true;
if(left)
ROOT=left;
if(left){
int lmx=SearchMax(left);
// printf("left%d lmx%d\n",left,lmx);
// print();
Splay(lmx);
son[lmx][]=right;
father[right]=lmx;
father[lmx]=-;
Root[id]=false;
Root[lmx]=true;
ROOT=lmx;
}
else if(right){
father[right]=-;
Root[id]=false;
Root[right]=true;
ROOT=right;
}
else{
init();
}
return true;
// print();
}
int findRoot(){ } void INSERT(int rt,int x){
int id=insert(rt,x);
printf("After insert\n");
print();
Splay(id);
printf("After Splay\n");
print();
}
int main(){
init();
scanf("%d%d",&n,&q);
//少写一个%d
int i,x;
for(i=;i<n;++i){
scanf("%d",&x);
INSERT(ROOT,x);
}
// printVAL();
for(i=;i<q;++i){
scanf("%d",&op);
if(op==){
scanf("%d",&x);
INSERT(ROOT,x);
}
else if(op==){
scanf("%d",&x);
int r=Delete(x);
if(r){
printf("Delete %d successful\n",x);
}
else printf("NOT FIND %d\n",x);
}
else if(op==){
scanf("%d",&x);
int id;
// print();
if((id=Search(ROOT,x))!=-){
printf("%d FIND v is %d\n",x,id);
}
else{
printf("%d NOT FIND\n",x);
}
}
else if(op==){
// printf("there22\n");
// printVAL();
print();
}
}
return ;
}
自己yy的Splay的更多相关文章
- BZOJ 3323 splay维护序列
就第三个操作比较新颖 转化成 在l前插一个点 把r和r+1合并 //By SiriusRen #include <cstdio> #include <cstring> #inc ...
- BZOJ 3729 splay维护DFS序+博弈论
思路: 这像是 阶梯Nim之类的东西 我们 直接把sg函数 设成mod(L+1)的 一棵子树 向下的奇数层上的石子xor起来 就是答案 有加点和改值的操作 就splay维护一下 //By Sirius ...
- bzoj 3506 && bzoj 1552 splay
查最小值,删除,翻转... 显然splay啊... #include<iostream> #include<cstdio> #include<algorithm> ...
- bzoj 1208 splay模板题2
自己yy了找前驱和后继,学了学怎么删除...(反正就是练模板) #include<iostream> #include<cstdio> #include<cstring& ...
- 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)
3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2271 Solved: 935[Submit][Stat ...
- 【BZOJ-2733】永无乡 Splay+启发式合并
2733: [HNOI2012]永无乡 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2048 Solved: 1078[Submit][Statu ...
- 【BZOJ】2209: [Jsoi2011]括号序列(splay)
http://www.lydsy.com/JudgeOnline/problem.php?id=2209 splay又犯逗........upd1那里的sum忘记赋值反............. 本题 ...
- Splay初步【bzoj1503】
做了一道水题,把bzoj1503用Splay重新写了一下. #include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i ...
- [bzoj1500][NOI2005]维修数列——splay
题目 题解 这道题可以说是数列问题的大BOSS,也算是这一周来学习splay等数据结构的一个总结. 我们一个一个地看这些操作. 对于操作1,我们首先建一棵子树,直接接上原树即可. 对于操作2,我们找到 ...
随机推荐
- SELinux的关闭与开启
SELinux是美国国家安全局对于强制访问控制的实现,是NSA在Linux社区的帮助下开发的一种访问控制体系,所以SELinux可以看做是安全强化的Linux子系统,和防火墙有相似点,作用之一是保证计 ...
- 7.SpringMVC注解优化
新建controller,每个人都可以建自己的controller,比较方便,不用再在web.xml中进行配置,value的请求地址一定要唯一. 优化: 1.上面示例中spring-annotatio ...
- C Primer Plus_第一章_概览_复习题与编程练习
REVIEW 1.就编程而言,可移植性表示什么? me 一个系统上编写的程序经过很少改动或者不需改动就可以在另一个系统上运行.如果修改是必须的,则通常只改变伴随主程序的一个头文件中的几项内容即可.(P ...
- 【工具】 原版完美激活 Flash builder 4.7 【非破解激活】
此方法原理在于激活 FlashBuilder 4.7 而不是破解(靠修改文件,或改变版本号),所以此破解更加稳定! FlashBuilder 4.7 下载地址: 32bit:http://trials ...
- 用户登录流程详解 +volley(StringRequest)
在实习期间由于要求使用volley,所以第一次开始接触volley,从一开始的迷茫陌生,到疯狂的查找各种资料,通过在项目中用到的实际问题,我想做一些总结,所以写了这篇文章.下面我将介绍我理解的用户登录 ...
- 【leetcode】Wildcard Matching(hard) ★ 大神太牛了
Implement wildcard pattern matching with support for '?' and '*'. '?' Matches any single character. ...
- ssh自动登陆
突然碰到有人问ssh再传输密钥时候能不手动输入密码,由于没有碰到过这种情况,所以查了一下发现可以用sshpass做到. sshpass [参数] ssh命令: 参数: -p password #将参 ...
- python安装paramiko模块
一.简介 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 由于使用的是python这样的能够跨平台运行的语言,所以所有python支 ...
- September 6th 2016 Week 37th Tuesday
I only wish to face the sea, with spring flowers blossoming. 我只愿面朝大海,春暖花开. That scenery is beautiful ...
- NYOJ题目1051simone牌文本编辑器
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAsgAAAKFCAIAAABeD4iTAAAgAElEQVR4nO3dO3LjOtOA4X8TzrUQx1