HDU 2852 KiKi's K-Number 主席树
2016-03-31 23:27
369 查看
题意:
要求维护一个数据结构,支持下面三种操作:\(0 \, e\):插入一个值为\(e\)的元素
\(1 \, e\):删除一个值为\(e\)的元素
\(2 \, a \, k\):查询比\(a\)大的数中的第\(k\)小
分析:
因为插入的数在\(10^5\)内,所以不需要离散化。维护一棵主席树,每次插入或者删除元素都新建一棵主席树。
对于查询操作,先查询不超过\(a\)的元素的个数\(cnt\),然后再查询序列中第\(cnt+k\)小即可。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 100000 + 10; const int maxnode = (maxn << 5); int n; int sz, root[maxn]; int lch[maxnode], rch[maxnode], sum[maxnode]; int update(int pre, int L, int R, int p, int v) { int rt = ++sz; sum[rt] = sum[pre] + v; if(L < R) { int M = (L + R) / 2; if(p <= M) { rch[rt] = rch[pre]; lch[rt] = update(lch[pre], L, M, p, v); } else { lch[rt] = lch[pre]; rch[rt] = update(rch[pre], M+1, R, p, v); } } return rt; } int Qcnt(int rt, int L, int R, int p) { if(L == R) return sum[rt]; int M = (L + R) / 2; if(p <= M) return Qcnt(lch[rt], L, M, p); else return Qcnt(rch[rt], M+1, R, p); } int Qsum(int rt, int L, int R, int p) { if(L == R) return sum[rt]; int M = (L + R) / 2; if(p <= M) return Qsum(lch[rt], L, M, p); else return sum[lch[rt]] + Qsum(rch[rt], M+1, R, p); } int kth(int rt, int L, int R, int k) { if(L == R) return L; int num = sum[lch[rt]]; int M = (L + R) / 2; if(num >= k) return kth(lch[rt], L, M, k); else return kth(rch[rt], M+1, R, k-num); } int main() { while(scanf("%d", &n) == 1) { int cnt = 0; sz = 0; while(n--) { int op, a; scanf("%d%d", &op, &a); if(op == 0) { cnt++; root[cnt] = update(root[cnt-1], 1, maxn, a, 1); } else if(op == 1) { if(!Qcnt(root[cnt], 1, maxn, a)) puts("No Elment!"); else { cnt++; root[cnt] = update(root[cnt-1], 1, maxn, a, -1); } } else { int b; scanf("%d", &b); int k = Qsum(root[cnt], 1, maxn, a); //printf("k1 = %d\n", k); k += b; //printf("k2 = %d\n", k); if(k > sum[root[cnt]]) { puts("Not Find!"); continue; } printf("%d\n", kth(root[cnt], 1, maxn, k)); } } } return 0; }
相关文章推荐
- SqlServer try catch 捕获不到的一些错误及解决方法
- PL/SQL Developer连接Oracle数据库的操作步骤
- 关于制作网页时乱码的问题详解
- SSH无法登陆可能原因分析
- SPOJ PT07J Query on a tree III(dfs序,主席树)
- Less系列之数学函数
- 网络端口号大全
- 浏览网页错误类型大全
- SQL中的LIKE语句的用法
- 坐标移动
- [BZOJ2081][POI2010]Beads(hash)
- Python基础知识注意点
- 2016-03-31深入理解SqlSession
- Swift系统自带二维码的扫描使用
- powerdesigner 16.5使用教程
- php如何定义数组常量
- 05-maven编辑替换jre为jdk
- Python写爬虫-爬甘农大学校新闻
- maven错误事例之一
- 网络层和传输层