bzoj 3224 平衡树 treap
来源:互联网 发布:网络刷到被骗了怎么办 编辑:程序博客网 时间:2024/05/17 12:04
代码:
#include <cstdio>#include <algorithm>#define N 100005using 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;}
阅读全文
1 0
- bzoj 3224 平衡树 treap
- 【treap】【bzoj 3224】: Tyvj 1728 普通平衡树
- BZOJ 3224 普通平衡树 裸treap模板题
- 【Treap】[BZOJ 3224]Tyvj 1728 普通平衡树
- bzoj 3224: Tyvj 1728 普通平衡树 treap
- bzoj 3224: Tyvj 1728 普通平衡树 Treap
- Treap模板 BZOJ 3224: Tyvj 1728 普通平衡树
- BZOJ 3224 Tyvj 1728 普通平衡树 (Treap)
- BZOJ 3224 Tyvj 1728 普通平衡树——treap
- BZOJ-3224 普通平衡树 TYVJ-1728 Treap + Vector
- Treap 全操作模板 bzoj 3224 普通平衡树
- BZOJ 1208 平衡树Treap模版题
- Treap树堆(bzoj 3224: Tyvj 1728 普通平衡树)
- 【Treap】[BZOJ 3224]Tyvj 1728 普通平衡树 & 非旋转实现
- [BZOJ 3224]普通平衡树(忽然想要存个模板 Treap/Splay)
- BZOJ 3224 洛谷 3369 【模板】普通平衡树(Treap/SBT)
- BZOJ 3196 二逼平衡树 线段树+treap
- 【 bzoj 1500 】NOI2005 维修序列 - 平衡树乱搞 treap
- ROS(三) 在gazebo中创建自己的机器人模型
- make 重定向输出
- HDU1065(数学水题)
- FireFox火狐不能设置新标签页
- Tiling Dominoes UVA
- bzoj 3224 平衡树 treap
- 最全前端资源汇集最全前端资源汇集
- HDU 2602 Bone Collector
- Codeforces812B Sagheer, the Hausmeister
- hdu4571最短路+记忆化搜索
- C语言--鸡兔同笼-假设法
- 正确使用动态方法
- Java实现-落单的数2
- 新闻客户端