Treap初步
2015-12-04 12:37
309 查看
模板题
bzoj3224: Tyvj 1728 普通平衡树
View Code
bzoj3224: Tyvj 1728 普通平衡树
#include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i <= b; i++) #define REP(i, a, b) for (int i = a; i < b; i++) #define drep(i, a, b) for (int i = a; i >= b; i--) #define mp make_pair #define pb push_back #define clr(x) memset(x, 0, sizeof(x)) #define xx first #define yy second using namespace std; typedef long long i64; const int inf = ~0U>>1; const i64 INF = ~0ULL>>1; //**************************** const int maxn = 100005; struct node { int l, r, v, rnd, w, sz; node() { l = r = v = rnd = w = sz = 0; } } tr[maxn]; int ndtot, root; void update(int k) { tr[k].sz = tr[tr[k].l].sz + tr[k].w + tr[tr[k].r].sz; } void lturn(int &k) { int t = tr[k].r; tr[k].r = tr[t].l; tr[t].l = k; tr[t].sz = tr[k].sz; update(k); k = t; } void rturn(int &k) { int t = tr[k].l; tr[k].l = tr[t].r; tr[t].r = k; tr[t].sz = tr[k].sz; update(k); k = t; } void insrt(int &k, int x) { if (!k) { k = ++ndtot; tr[k].v = x, tr[k].rnd = rand(), tr[k].w = tr[k].sz = 1; return; } tr[k].sz++; if (tr[k].v == x) tr[k].w++; else if (x > tr[k].v) { insrt(tr[k].r, x); if (tr[tr[k].r].rnd < tr[k].rnd) lturn(k); } else if (x < tr[k].v) { insrt(tr[k].l, x); if (tr[tr[k].l].rnd < tr[k].rnd) rturn(k); } } int query_num(int &k, int x) { if (!k) return 0; if (x <= tr[tr[k].l].sz) return query_num(tr[k].l, x); else if (x > tr[tr[k].l].sz + tr[k].w) return query_num(tr[k].r, x - tr[tr[k].l].sz - tr[k].w); else return tr[k].v; } void fix(int &k, int x) { if (!k) return; if (tr[k].v >= x) { fix(tr[k].l, x); if (tr[k].l && tr[tr[k].l].v >= x) rturn(k); } else { fix(tr[k].r, x); if (tr[k].r && tr[tr[k].r].v >= x) lturn(k); } } char str[5]; int main() { int n, m; scanf("%d%d", &n, &m); int tot(0); int be(0); insrt(root, 0x3f3f3f3f); while (n--) { int x; scanf("%s%d", str, &x); if (str[0] == 'I') { if (x >= m) insrt(root, x - tot), be++; } else if (str[0] == 'A') tot += x; else if (str[0] == 'S') { tot -= x; fix(root, m - tot); tr[root].sz -= tr[tr[root].l].sz; tr[tr[root].l] = node(); tr[root].l = 0; } else { if (x + 1 > tr[root].sz) puts("-1"); else printf("%d\n", query_num(root, tr[root].sz - x) + tot); } } printf("%d\n", be - tr[root].sz + 1); return 0; }
View Code
相关文章推荐
- DrawSVG - SVG 路径动画 jQuery 插件
- HTML5新特性总结
- 使用开源项目Asynchttpclient的GET_POST访问网络,上传文件
- 南大软院大神养成计划第十九天
- 【网络编程基础】Linux下进程通信方式(共享内存,管道,消息队列,Socket)
- mongodump & mongorestore
- java统计中文字符出现次数
- java 试题java编译问题
- 读取文件夹下的文件列表
- 磁盘缓存
- 给可滚动的View 添加头部,解决竖直方向的事件冲突
- 【iOS Programming: The Big Nerd Ranch Guide】【笔记】2
- iptables 规则执行顺序
- 集群
- 【CoreData】 简单地使用
- 【CoreData】 简单地使用
- LeetCode() Insert Interval
- 一个简单的jsp网页与MySQL链接的简单账户管理网页
- TI BLE CC2541协议栈数据加密与解密功能
- 无法识别的配置节 system.serviceModel。