您的位置:首页 > 其它

bzoj 3224 平衡树 treap

2017-06-02 20:42 148 查看
代码:

#include <cstdio>
#include <algorithm>
#define N 100005
using namespace std;
inline int read() {
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
struct date{
int l, r, key, siz, w, rnd;
};
date tr[N * 2];
int rt, n, size, opt, ans, x;
inline void update( int k ) {
tr[k].siz = tr[tr[k].l].siz + tr[tr[k].r].siz + tr[k].w;
}
inline void lturn( int &k ) {
int t = tr[k].r; tr[k].r = tr[t].l;
tr[t].l = k; tr[t].siz = tr[k].siz;
update(k); k = t;
}
inline void rturn( int &k ) {
int t = tr[k].l; tr[k].l = tr[t].r;
tr[t].r = k; tr[t].siz = tr[k].siz;
update(k); k = t;
}
inline int rand() {
static int seed = 7;
return seed = (int)seed*48271LL%2147483647;
}
void insert( int &k, int x ) {
if ( !k ) {
size++; k = size;
tr[k].siz = tr[k].w = 1;
tr[k].key = x;
tr[k].rnd = rand();
return;
}
tr[k].siz++;
if ( x == tr[k].key ) tr[k].w++;
else if ( x > tr[k].key ) {
insert( tr[k].r, x );
if( tr[tr[k].r].rnd < tr[k].rnd ) lturn(k);
}
else {
insert( tr[k].l, x );
if( tr[tr[k].l].rnd < tr[k].rnd ) rturn(k);
}
}
void del( int &k, int x ) {
if ( !k ) return;
if ( x == tr[k].key ) {
if ( tr[k].w > 1 ) {
tr[k].siz--;
tr[k].w--;
return;
}
if ( tr[k].l * tr[k].r == 0 ) k = tr[k].l + tr[k].r;
else if ( tr[tr[k].l].rnd < tr[tr[k].r].rnd ) rturn(k), del(k, x);
else lturn(k), del(k, x);
}
else if ( x > tr[k].key ) tr[k].siz--,del(tr[k].r, x);
else tr[k].siz--,del(tr[k].l, x);
}
int query_rank( int k, int x ) {
if ( !k ) return 0;
if ( x == tr[k].key ) return tr[tr[k].l].siz + 1;
if ( x < tr[k].key ) return query_rank(tr[k].l, x);
else return tr[tr[k].l].siz + tr[k].w + query_rank(tr[k].r, x);
}
int query_num( int k, int x ) {
if ( !k ) return 0;
if ( x <= tr[tr[k].l].siz ) return query_num( tr[k].l, x );
if ( x > tr[k].w + tr[tr[k].l].siz ) return query_num( tr[k].r, x - tr[k].w-tr[tr[k].l].siz);
return tr[k].key;
}
void query_pro ( int k, int x ) {
if ( !k ) return;
if ( x > tr[k].key ) {
ans = tr[k].key;
query_pro( tr[k].r, x );
}
else query_pro( tr[k].l, x );
}
void query_sub ( int k, int x ) {
if ( !k ) return;
if ( x < tr[k].key ) {
ans = tr[k].key;
query_sub( tr[k].l, x );
}
else query_sub( tr[k].r, x );
}
int main() {
n = read();
for ( register int i = 1; i <= n; i++ ) {
opt = read(); x = read();
switch(opt) {
case 1: insert(rt, x);break;
case 2: del(rt, x);break;
case 3: printf( "%d\n", query_rank(rt, x) );break;
case 4: printf( "%d\n", query_num(rt, x) );break;
case 5: query_pro(rt, x);printf( "%d\n", ans );break;
case 6: query_sub(rt, x);printf( "%d\n", ans );break;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  treap