[BZOJ3224]Tyvj 1728 普通平衡树 && treap
2015-06-07 09:25
399 查看
逗号打成分号搞了好久 艹艹艹
#include<cstdio> #include<algorithm> #include<cstring> #include<iostream> #include<queue> #define SF scanf #define PF printf using namespace std; typedef long long LL; inline int read() { int x=0, f=1; char ch=getchar(); while(ch<'0' || ch>'9') { if(ch=='-') f=-1; ch=getchar(); } while('0'<=ch && ch<='9') { x=x*10+ch-'0'; ch=getchar(); } return x*f; } const int MAXN = 500000; int n, ans, root; struct Treap { int l[MAXN+10], r[MAXN+10], sz[MAXN+10], rnd[MAXN+10], val[MAXN+10], cnt[MAXN+10]; int ncnt; void up(int x) { sz[x] = sz[l[x]] + sz[r[x]] + cnt[x]; } void lturn(int &x) { int t = r[x]; r[x] = l[t]; l[t] = x; sz[t] = sz[x]; up(x); x= t; } void rturn(int &x) { int t =l[x]; l[x] = r[t]; r[t] = x; sz[t] = sz[x]; up(x); x = t; } int NewNode(int key) { ncnt++; sz[ncnt] = cnt[ncnt] = 1; val[ncnt] = key; rnd[ncnt] = rand(); return ncnt; } void ins(int &x, int key) { if(!x) { x = NewNode(key); return ; } sz[x]++; if(val[x] == key) cnt[x]++; else if(key > val[x]) { ins(r[x], key); if(rnd[r[x]] < rnd[x]) lturn(x); } else { ins(l[x], key); if(rnd[l[x]] < rnd[x]) rturn(x); } } void del(int &x, int key) { if(!x) return ; if(val[x] == key) { if(cnt[x] > 1) { cnt[x]--; sz[x]--; return ;} if(l[x]*r[x] == 0) x = l[x]+r[x]; else if(rnd[l[x]] < rnd[r[x]]) rturn(x), del(x, key); else lturn(x), del(x, key); } else if(key > val[x]) sz[x]--, del(r[x], key); else sz[x]--, del(l[x], key); } int Find_rank(int x, int key) { if(!x) return 0; if(val[x] == key) return sz[l[x]]+1; else if(key > val[x]) return sz[l[x]]+cnt[x]+Find_rank(r[x], key); else return Find_rank(l[x], key); } int Find_val(int x, int k) { if(!x) return 0; if(k <= sz[l[x]]) return Find_val(l[x], k); else if(k > sz[l[x]]+cnt[x]) return Find_val(r[x], k-sz[l[x]]-cnt[x]); return val[x]; } void Find_pre(int x, int key) { if(!x) return ; if(val[x] < key) { ans = x; Find_pre(r[x], key); } else Find_pre(l[x], key); } void Find_nex(int x, int key) { if(!x) return ; if(val[x] > key) { ans = x; Find_nex(l[x], key); } else Find_nex(r[x], key); } } tp; int main() { for (n = read(); n; --n) { int op = read(), x = read(); switch (op) { case 1: tp.ins(root, x); break; case 2: tp.del(root, x); break; case 3: printf("%d\n", tp.Find_rank(root, x)); break; case 4: printf("%d\n", tp.Find_val(root, x)); break; case 5: ans = 0; tp.Find_pre(root, x); PF("%d\n", tp.val[ans]); break; case 6: ans = 0; tp.Find_nex(root, x); PF("%d\n", tp.val[ans]); break; } } return 0; }
相关文章推荐
- NYOJ 38 布线问题_(解法1 Kruskal算法)
- JDBC batch批量Statement executeBatch 详细解释
- valueForKeyPath用途
- java生成随机数的两种方式
- NYOJ筹建工程之并查集and最小生成树prim算法
- 理解Javascript的动态语言特性
- python学习笔记glob模块
- java生成随机数的两种方式
- 关于intellij ide的tomcat的部署和配置
- Android25闹钟项目——tabhost的使用
- 启用https协议的方法
- 操作系统原理:进程管理4和5
- DHCP服务的配置
- hdu3339 dijkstra + dp
- HDOJ畅通工程之并查集and最小生成树prim算法
- 《你的灯亮着吗》阅读笔记三
- cdoj1088-王之迷宫 (三维迷宫最短路径)【BFS】
- 博客开篇
- hdoj 1317 XYZZY 【spfa判断正环求最长路径&&floyd求传递闭包】
- Asp.net 2.0 无刷新图片上传 显示缩略图 具体实现