0x46藍書習題 普通平衡樹

2022-02-27 12:11:07 字數 963 閱讀 6550

藍書習題:普通平衡樹

這道題是一道平衡樹模板題,可以用多種解法,這裡用最簡單的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;

}