splay_tree第一题,总算开始做白书了。。。
参考白书程序写(chao)了写(chao),意外的很快就ac了
ACCODE和注释奉上:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int n,m;
struct Poi{
Poi *s[2];
int v,siz,flag;
Poi(){}//新建节点:null专用
Poi(int v,Poi* nl):v(v){//新建节点:带值
s[0]=s[1]=nl;siz=v+1;flag=0;
}
int cmp(int x){//判断旋转方向
if (x==s[0]->siz+1) return -1;
return x<s[0]->siz+1?0:1;
}
void maintain(){//调整size
siz=s[0]->siz+s[1]->siz+1;
}
void push_down(){//lazy翻转标记下传
if (!flag) return;
flag=0;
swap(s[0],s[1]);//翻转
s[0]->flag^=1;s[1]->flag^=1;//标记下传
}
};
struct Splay_tree{
Poi *root;
Poi *null;
void build(Poi* &ro,int kk){//建树
if (kk<0) return;
ro=new Poi(kk,null);//新建带值节点
build(ro->s[0],kk-1); //递归:保证root节点被更新 ,注意ro是传