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普通平衡树bzoj3224
- (treap)[bzoj3224][洛谷3369][cogs1829]Tyvj 1728 普通平衡树
- 【bzoj 3224】普通平衡树(Treap 模板)
- BZOJ 3224 普通平衡树 treap or vector
- BZOJ 3224 Tyvj 1728 普通平衡树——treap
- BZOJ 3224 Tyvj 1728 普通平衡树 (Treap)
- Treap树堆(bzoj 3224: Tyvj 1728 普通平衡树)
- 无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)
- 【bzoj3224】普通平衡树——treap
- [BZOJ3224]Tyvj 1728 普通平衡树 && treap
- 【Treap】[BZOJ 3224]Tyvj 1728 普通平衡树 & 非旋转实现
- BZOJ-3224 普通平衡树 TYVJ-1728 Treap + Vector
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
- 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树
- [BZOJ3224]普通平衡树(旋转treap,STL-vector)
- 【Treap模板详细注释】BZOJ3224-普通平衡树
- bzoj3224 Tyvj 1728 普通平衡树 treap
- BZOJ 3224: Tyvj 1728 普通平衡树 treap
- bzoj3224 普通平衡树 Treap
- [您有新的未分配科技点]无旋treap:从好奇到入门(例题:bzoj3224 普通平衡树)