Sbt 带查找、查询、删除操作
来源:互联网 发布:幼儿园膳食营养软件 编辑:程序博客网 时间:2024/05/15 02:36
#include<bits/stdc++.h>using namespace std;const int maxn = 200000 + 10;struct SBT { int cnt; int c[maxn][2], key[maxn], size[maxn]; void init() { cnt = 0; memset(c, 0, sizeof(c)); memset(size, 0, sizeof(size)); } void Push_up(int u) { size[u] = size[c[u][0]] + size[c[u][1]] + 1; } //left -> 1, right -> 0 void rotate(int &u, bool t) { int k = c[u][t]; c[u][t] = c[k][!t]; c[k][!t] = u; size[k] = size[u]; Push_up(u), u = k; } void maintain(int &u, bool t) { if(!t) { if(size[c[u][1]] < size[c[c[u][0]][0]]) rotate(u, 0); else { if(size[c[u][1]] < size[c[c[u][0]][1]]) { rotate(c[u][0], 1); rotate(u, 0); }else return; } }else { if(size[c[u][0]] < size[c[c[u][1]][1]]) rotate(u, 1); else { if(size[c[u][0]] < size[c[c[u][1]][0]]) { rotate(c[u][1], 0); rotate(u, 1); }else return; } } maintain(c[u][0], false); maintain(c[u][1], true); maintain(u, false); maintain(u, true); } void insert(int &u, int v) { if(!u) { key[u = ++cnt] = v; size[u] = 1; }else { size[u]++; if(v >= key[u]) insert(c[u][1], v); else insert(c[u][0], v); maintain(u, v >= key[u]); } } int del(int &u, int v) { if(key[u] == v || ((v < key[u] && c[u][0] == 0) || (v > key[u] && c[u][1] == 0))) { int k = key[u]; if(c[u][0] == 0 || c[u][1] == 0) u = c[u][0] + c[u][1]; else key[u] = del(c[u][0], k+1); return k; }else { if(v > key[u]) return del(c[u][1], v); else return del(c[u][0], v); } } int search(int u, int v) { if(u == 0 || v == key[u]) return u; else { if(v > key[u]) return search(c[u][1], v); else return search(c[u][0], v); } } int query(int u, int k) { int s = size[c[u][0]] + 1; if(k == s) return key[u]; else { if(k > s) return query(c[u][1], k-s); else return query(c[u][0], k); } } void out(int n) { if(c[n][0]) out(c[n][0]); cout << key[n] << ' '; if(c[n][1]) out(c[n][1]); }}Sbt;int main() {#ifndef ONLINE_JUDGE freopen("data.txt", "r", stdin); freopen("ans.txt", "w", stdout);#endif int n, m, v, rt = 0; cin >> n; Sbt.init(); while(n--) { cin >> m >> v; switch(m) { case 1: Sbt.insert(rt, v); break; case 2: Sbt.del(rt, v); break; case 3: Sbt.search(rt, v); break; case 4: Sbt.query(rt, v); break; case 5: Sbt.out(rt); break; } } //Sbt.out(rt); return 0;}
0 0
- Sbt 带查找、查询、删除操作
- SQLite C-API带参数的查询/更新/删除操作
- SQLiteDatabase 自带添加、删除、更新、查询的操作方
- Java数据结构线性表中插入、删除、查询、成串、查找等操作
- 二叉查找树删除操作
- 单链表操作---建表,查找,删除
- 查找 -- 红黑树的删除操作
- Rank-Tree带动态查询删除 Splay
- Hibernate插入、查询、删除操作
- Hibernate插入、查询、删除操作
- 二叉排序树--查询--插入--删除操作
- 链表的循环带删除操作
- hibernate增加,删除,修改,查找操作
- 单链表操作(建表、插入、删除、查找、求表长),
- 二叉查找树的删除操作
- 单链表建立,插入,删除,查找,遍历操作
- 单链表建立,插入,删除,查找,遍历操作
- 查找二叉树删除节点的操作
- 洛谷 P2530 [SHOI2001] 化工厂装箱员
- 划分树(求区间第k小值)
- tomcat在win7下不能连接的解决方案
- servlet redirect/forward/session/cookie 与 HTTP 协议的测试
- JMockit主要Mock过程
- Sbt 带查找、查询、删除操作
- Linux is not Matrix——FastDFS 海量数据存起来
- SSH框架的搭配使用的小例子
- Tyvj P1015 公路乘车
- mysql存储过程详解
- 透视
- 编写一个孤儿进程,这个进程可以同时创建100僵尸进程
- Hdu 5777多米诺[贪心]
- Struts2自定义拦截器