就是裸的平衡树的说= =

怎么就是做不出呢。。。

直接写Treap好了,反正Splay至今不会233

  1 /**************************************************************
  2     Problem: 3224
  3     User: rausen
  4     Language: C++
  5     Result: Accepted
  6     Time:212 ms
  7     Memory:4032 kb
  8 ****************************************************************/
  9
 10 #include <cstdio>
 11 #include <cstdlib>
 12 #include <ctime>
 13
 14 #define lson tr[r].l
 15 #define rson tr[r].r
 16 using namespace std;
 17 const int N = 100001;
 18 const int Maxlen = 900005;
 19
 20 struct treap_node {
 21     int l, r, v, sz, key, cnt;
 22 }tr[N];
 23
 24 int n, cnt, root, ans, x;
 25 char buf[Maxlen];
 26 int Left, Len;
 27
 28 inline int read() {
 29     int x = 0, sgn = 1;
 30     while (buf[Left] < '0' || '9' < buf[Left])
 31         if (buf[Left++] == '-') sgn = -1;
 32     while ('0' <= buf[Left] && buf[Left] <= '9')
 33         x = x * 10 + buf[Left++] - '0';
 34     return sgn * x;
 35 }
 36
 37 int len = 0, pr[15];
 38 inline void print(int x) {
 39     if (x < 0) putchar('-'), x = -x;
 40     while (x)
 41         pr[++len] = x % 10, x /= 10;
 42     if (!len) putchar('0');
 43     while (len)
 44         putchar(pr[len--] + '0');
 45     puts("");
 46 }
 47
 48
 49 inline void update(int r) {
 50     tr[r].sz = tr[lson].sz + tr[rson].sz + tr[r].cnt;
 51 }
 52
 53 inline void rturn(int &r) {
 54     int t = lson;
 55     lson = tr[t].r;
 56     tr[t].r = r, tr[t].sz = tr[r].sz;
 57     update(r);
 58     r = t;
 59 }
 60
 61 inline void lturn(int &r) {
 62     int t = rson;
 63     rson = tr[t].l;
 64     tr[t].l = r, tr[t].sz = tr[r].sz;
 65     update(r);
 66     r = t;
 67 }
 68
 69 void ins(int &r) {
 70     if (r == 0) {
 71         r = ++cnt;
 72         tr[r].sz = tr[r].cnt = 1;
 73         tr[r].v = x;
 74         tr[r].key = rand();
 75         return;
 76     }
 77     ++tr[r].sz;
 78     if (tr[r].v == x)
 79         ++tr[r].cnt;
 80     else if (x > tr[r].v) {
 81         ins(rson);
 82         if (tr[rson].key < tr[r].key)
 83             lturn(r);
 84     } else {
 85         ins(lson);
 86         if (tr[lson].key < tr[r].key)
 87             rturn(r);
 88     }
 89 }
 90
 91 void del(int &r) {
 92     if (r == 0) return;
 93     if (tr[r].v == x) {
 94         if (tr[r].cnt > 1) {
 95             --tr[r].cnt, --tr[r].sz;
 96             return;
 97         }
 98         if (!lson || !rson)
 99             r = lson + rson;
100         else if (tr[lson].key < tr[rson].key)
101                 rturn(r), del(r);
102         else lturn(r), del(r);
103     }
104     else if (x > tr[r].v) --tr[r].sz, del(rson);
105     else --tr[r].sz, del(lson);
106 }
107
108 int query_rank(int r) {
109     if (r == 0) return 0;
110     if (tr[r].v == x)
111         return tr[lson].sz + 1;
112     else if (x > tr[r].v)
113         return tr[lson].sz + tr[r].cnt + query_rank(rson);
114     return query_rank(lson);
115 }
116
117 int query_kth (int r, int x) {
118     if (r == 0) return 0;
119     if (x <= tr[lson].sz) return query_kth(lson, x);
120     else if (x > tr[lson].sz + tr[r].cnt)
121         return query_kth(rson, x - tr[lson].sz - tr[r].cnt);
122     else return tr[r].v;
123 }
124
125 void query_pre(int r) {
126     if (r == 0) return;
127     if (tr[r].v < x) {
128         ans = r;
129         query_pre(rson);
130     } else query_pre(lson);
131 }
132
133 void query_next(int r) {
134     if (r == 0) return;
135     if (tr[r].v > x) {
136         ans = r;
137         query_next(lson);
138     } else query_next(rson);
139 }
140
141 int main() {
142     int i, oper;
143     Len = fread(buf, 1, Maxlen, stdin);
144     buf[Len] = ' ';
145     n = read();
146     for (i = 1; i <= n; ++i) {
147         oper = read(), x = read();
148         if (oper == 1)
149             ins(root); else
150         if (oper == 2)
151             del(root); else
152         if (oper == 3)
153             print(query_rank(root)); else
154         if (oper == 4)
155             print(query_kth(root, x)); else
156         if (oper == 5) {
157             ans = 0, query_pre(root);
158             print(tr[ans].v);
159         } else
160         if (oper == 6) {
161             ans = 0, query_next(root);
162             print(tr[ans].v);
163         }
164     }
165     return 0;
166 }

View Code

转载于:https://www.cnblogs.com/rausen/p/4113933.html

BZOJ3224 Tyvj 1728 普通平衡树相关推荐

  1. bzoj3224: Tyvj 1728 普通平衡树(splay)

    3224: Tyvj 1728 普通平衡树 题目:传送门 题解: 啦啦啦啦又来敲个模版水经验啦~ 代码: 1 #include<cstdio> 2 #include<cstring& ...

  2. bzoj3224 Tyvj 1728 普通平衡树题解--Treap

    题面: Description您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有 ...

  3. bzoj3224: Tyvj 1728 普通平衡树(打个splay暖暖手)

    (其实今天好热啊? 题目大意:插入,删除,k小,前驱后继,数的排名. splay和treap裸题...过几天补个treap的 splay: #include<iostream> #incl ...

  4. 替罪羊树—BZOJ3224: Tyvj 1728 普通平衡树

    冬令营被平衡树坑了之后,打算苦练一番数据结构(QAQ). 先是打了一下想学好久的替罪羊树. 替罪羊树实现方法很简单,就是在不满足平衡条件的时候暴力重构子树. 调试小结: 1.删除操作分两类情况:如果某 ...

  5. BZOJ 3224: Tyvj 1728 普通平衡树 treap

    3224: Tyvj 1728 普通平衡树 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/p ...

  6. BZOJ 3224: Tyvj 1728 普通平衡树【Treap】

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec Memory Limit: 128 MB Description 您需要写一种数据结构(可参考题目标题),来维护一些数 ...

  7. BZOJ 3224: Tyvj 1728 普通平衡树

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 9629  Solved: 4091 [Submit][S ...

  8. 3224: Tyvj 1728 普通平衡树

    3224: Tyvj 1728 普通平衡树 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 14480  Solved: 6275 Descripti ...

  9. Treap树堆(bzoj 3224: Tyvj 1728 普通平衡树)

    Treap树堆:一种排序二叉树(中序遍历权值有序) 每个节点有两个关键字:key[]和rand[] 其中key[]满足二叉搜索树性质,rand[]满足堆性质(即Tree+Heap=Treap)即 如果 ...

  10. 【BZOJ】3224: Tyvj 1728 普通平衡树

    [题意] 1. 插入x数 2. 删除x数(若有多个相同的数,因只删除一个) 3. 查询x数的排名(若有多个相同的数,因输出最小的排名) 4. 查询排名为x的数 5. 求x的前驱(前驱定义为小于x,且最 ...

最新文章

  1. oracle添加新字段sql,oracle 构造添加字段的SQL语句
  2. PAT (Advanced Level) 1140~1143:1140模拟 1141模拟 1142暴力 1143 BST+LCA
  3. ai驱动数据安全治理_JupyterLab中的AI驱动的代码完成
  4. 1-4dockerfile基本使用
  5. 关于lock_guard使用细节
  6. 把庞大的 npm script 拆到单独文件中
  7. netty keepalive 和 idle 的关系
  8. Git是目前世界上最先进的分布式版本控制系统(没有之一)。
  9. JS 逻辑中断(一)
  10. exchange无法收发邮件_【知乎最详细】Windows邮件amp;日历UWP+QQ邮箱如何设置
  11. 如何过滤freebayes得到原始vcf文件
  12. 中国大学MOOC伦理学题库及答案
  13. h3c trunk口改access_关于h3c的trunk模式
  14. 单片机基础知识点 01
  15. tensorflow2实现vnet
  16. CentOS历史版本下载
  17. vue自动计算日期天数
  18. CSS3基础(4)——CSS3 渲染属性
  19. Mirror for Samsung TV for mac(三星智能电视投屏软件)
  20. Android CardView使用详解

热门文章

  1. 配置中心Nacos与Apollo比较
  2. android修改对话框大小设置,android – 如何更改对话框首选项消息的文本大小?...
  3. Java I/O系统之转换流
  4. 【渝粤教育】国家开放大学2018年春季 0408-22T管理学基础 参考试题
  5. 高精度运算一(两个数的运算)
  6. cublas中执行矩阵乘法运算的函数 首先要注意的是cublas使用的是以列为主的存储方式,和c/c++中的以行为主的方式是不一样的。处理方法可参考下面的注释代码
  7. jq22扒的网站, 左右箭头图标问题
  8. .net remoting 使用事件
  9. 自动生成构造方法、getter、setter
  10. P3512 [POI2010]PIL-Pilots