BZOJ3224——Tyvj 1728 普通平衡树
来源:互联网 发布:apachemysql数据库管理 编辑:程序博客网 时间:2024/06/06 14:29
1、题目大意:数据结构题,是treap,全都是treap比较基本的操作
2、分析:没啥思考的
#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>using namespace std;struct Node{ Node *ch[2]; int r, v, s, num; bool operator < (const Node& rhs) const{ return r < rhs.r; } int cmp(int x){ if(x < v) return 0; if(x == v) return -1; return 1; } int cmp1(int x){ int k = num; if(ch[0]) k += ch[0] -> s; if(k - num + 1 <= x && x <= k) return -1; if(x <= k - num) return 0; return 1; } void maintain(){ s = num; if(ch[0]) s += ch[0] -> s; if(ch[1]) s += ch[1] -> s; }};struct treap{ Node ft[5000000]; int tot; Node *root; void rotate(Node* &o, int d){ Node* k = o -> ch[d ^ 1]; o -> ch[d ^ 1] = k -> ch[d]; k -> ch[d] = o; o -> maintain(); k -> maintain(); o = k; } void insert(Node* &o, int x){ if(o == NULL){ o = &ft[tot ++]; o -> ch[0] = o -> ch[1] = NULL; o -> v = x; o -> r = rand(); o -> num = o -> s = 1; return; } int d = o -> cmp(x); if(d == -1) o -> num ++; else { insert(o -> ch[d], x); if(o -> ch[d] > o) rotate(o, d ^ 1); } o -> maintain(); } void remove(Node* &o, int x){ int d = o -> cmp(x); if(d == -1){ if(o -> num > 1) o -> num --; else if(o -> ch[0] && o -> ch[1]) { int d2 = 0; if(o -> ch[0] > o -> ch[1]) d2 = 1; rotate(o, d2); remove(o -> ch[d2], x); } else { if(o -> ch[0]){ o = o -> ch[0]; } else o = o -> ch[1]; } } else remove(o -> ch[d], x); if(o) o -> maintain(); } int find(Node* &o, int x){ if(o == NULL) return 0; int d = o -> cmp(x); if(d == -1) return o -> num; return find(o -> ch[d], x); } int less_k(Node* &o, int k){ if(o == NULL) return 0; int d = o -> cmp(k); int yy = o -> num; if(o -> ch[0]) yy += o -> ch[0] -> s; if(d == -1) return yy - o -> num; else if(d == 0) return less_k(o -> ch[0], k); else return less_k(o -> ch[1], k) + yy; } int kth(Node* &o, int k){ int d = o -> cmp1(k); int yy = o -> num; if(o -> ch[0]) yy += o -> ch[0] -> s; if(d == -1) return o -> v; if(d == 0) return kth(o -> ch[0], k); return kth(o -> ch[1], k - yy); }} wt;int main(){ int n; scanf("%d", &n); for(int i = 1; i <= n; i ++){ int op, x; scanf("%d%d", &op, &x); if(op == 1){ wt.insert(wt.root, x); } else if(op == 2){ wt.remove(wt.root, x); } else if(op == 3){ printf("%d\n", wt.less_k(wt.root, x) + 1); } else if(op == 4){ printf("%d\n", wt.kth(wt.root, x)); } else if(op == 5){ int yy = wt.less_k(wt.root, x); printf("%d\n", wt.kth(wt.root, yy)); } else{ int yy = wt.less_k(wt.root, x); yy += wt.find(wt.root, x) + 1; printf("%d\n", wt.kth(wt.root, yy)); } } return 0;}
0 0
- BZOJ3224——Tyvj 1728 普通平衡树
- [Bzoj3224]Tyvj 1728 普通平衡树
- [BZOJ3224]Tyvj 1728 普通平衡树 && treap
- [BZOJ3224]Tyvj 1728 普通平衡树
- 【bzoj3224】Tyvj 1728 普通平衡树
- [BZOJ3224] Tyvj 1728 普通平衡树
- 【bzoj3224】Tyvj 1728 普通平衡树
- 【BZOJ3224】Tyvj 1728 普通平衡树
- bzoj3224: Tyvj 1728 普通平衡树
- bzoj3224 Tyvj 1728 普通平衡树
- 【BZOJ3224】 Tyvj 1728 普通平衡树
- 【bzoj3224】Tyvj 1728 普通平衡树
- 【bzoj3224】Tyvj 1728 普通平衡树
- bzoj3224 Tyvj 1728 普通平衡树 treap
- bzoj3224 Tyvj 1728 普通平衡树
- [BZOJ3224]Tyvj 1728 普通平衡树 && 重写平衡树
- bzoj3224: Tyvj 1728 普通平衡树(伸展树)
- bzoj3224 Tyvj 1728 普通平衡树 ( 替罪羊树)
- Canvas——标准五星红旗画法
- 简单XML文件
- [Sencha ExtJS & Touch] 表格(Ext.grid.Grid) 和 表格视图选项(Ext.grid.plugin.ViewOptions) 使用的时候要注意的问题
- ScrollView中嵌套GridView,Listview的办法
- <JAVA学习笔记一>——程序的国际化
- BZOJ3224——Tyvj 1728 普通平衡树
- MySQL学习笔记之二
- JDBC的储存过程 剖解
- 动画设置参数,有数值,收藏了
- git 提交时,每次都需要输入用户名、密码
- 系统性能估算游乐场模型
- BZOJ3223——Tyvj 1729 文艺平衡树
- 视觉slam学习(一):历史与现状
- 高速信号走线规则