藍書習題:普通平衡樹
這道題是一道平衡樹模板題,可以用多種解法,這裡用最簡單的treap,下面簡單說一下各種操作的思路
完整**:
#includeusing namespace std;
typedef long long ll;
const int ma=1e5+5;
const int inf=0x3f3f3f3f;
struct treap
a[ma];
int tot,n,root;
int new(int val)
void updata(int p)
void build()
void zig(int &p)
void zag(int &p)
void insert(int &p,int val)
if(val==a[p].val)
if(val1)
if(a[p].l||a[p].r)
else p=0; //p是葉子直接刪除
return;
} if(val=rak) return getvalbyrank(a[p].l,rak); //左子樹siz>rak,說明排名為rak的節點在左子樹中
if(a[a[p].l].siz+a[p].cnt>=rak) return a[p].val; //左子樹的siz+p點的cnt>rank,而且左子樹的siz0)
break;
} if(a[p].vala[ans].val) ans=p; //用p的值更新ans,找小於val的最大值
p= val0)p=a[p].l;
ans=p;
}break;
} if(a[p].val>val&&a[p].valp= val} return a[ans].val;
}int main()
return 0;
}