HDU 2852 KiKi's K-Number 主席树
题意:
要求维护一个数据结构,支持下面三种操作:
- \(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;
}
HDU 2852 KiKi's K-Number 主席树的更多相关文章
- 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)
Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...
- poj2104 k-th number 主席树入门讲解
poj2104 k-th number 主席树入门讲解 定义:主席树是一种可持久化的线段树 又叫函数式线段树 刚开始学是不是觉得很蒙逼啊 其实我也是 主席树说简单了 就是 保留你每一步操作完成之后 ...
- poj 2104 K-th Number 主席树+超级详细解释
poj 2104 K-th Number 主席树+超级详细解释 传送门:K-th Number 题目大意:给出一段数列,让你求[L,R]区间内第几大的数字! 在这里先介绍一下主席树! 如果想了解什么是 ...
- hdu 2665 Kth number 主席树
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Prob ...
- hdu 2852 KiKi's K-Number (线段树)
版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 2852 题意: 一个容器,三种操作: (1) 加入一个数 e (2) 删除一个数 e,如果不存在则输出 No Elment! (3) 查 ...
- 【POJ】2104 K-th Number(区间k大+主席树)
http://poj.org/problem?id=2104 裸题不说.主席树水过. #include <cstdio> #include <iostream> #includ ...
- POJ 2104 K-th Number 主席树(区间第k大)
题目链接: http://poj.org/problem?id=2104 K-th Number Time Limit: 20000MSMemory Limit: 65536K 问题描述 You ar ...
- HDU 5919 - Sequence II (2016CCPC长春) 主席树 (区间第K小+区间不同值个数)
HDU 5919 题意: 动态处理一个序列的区间问题,对于一个给定序列,每次输入区间的左端点和右端点,输出这个区间中:每个数字第一次出现的位子留下, 输出这些位子中最中间的那个,就是(len+1)/2 ...
- HDU - 2665 Kth number 主席树/可持久化权值线段树
题意 给一个数列,一些询问,问$[l,r]$中第$K$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久 ...
随机推荐
- Linux学习笔记——如何使用echo指令向文件写入内容
0.前言 本文总结如何使用echo命令向文件中写入内容,例如使用echo指令覆盖文件内容,使用echo指令向文件追加内容,使用echo指令往文件中追加制表符. echo向文件中输出内容 ...
- TestNG ABC
TestNG ABC 资源 官网 :http://testng.org/doc/index.html Maven示例 <dependency> <groupI ...
- linq动态分页排序
if (!string.IsNullOrEmpty(order) && !string.IsNullOrEmpty(dir))//判断排序的字段名称和排序的类型是否为空 { if (d ...
- nodejs 实践:express 最佳实践 (一) 项目结构
express 最佳实践 (一) 第二篇: express 最佳实践(二):中间件 最近,一直在使用 nodejs 做项目,对 nodejs 开发可以说深有体会. 先说说 nodejs 在业务中的脚色 ...
- 【extjs6学习笔记】1.4 初始:ajax请求django应用
使用sencha创建应用,默认如下: personnel数据使用的是本地数据 做以下修改,使用ajax 启动时会报404[此次调用是使用nginx部署] django应用app_jiake中,修改vi ...
- Linux 安装Memcache扩展支持
查看相关软件包 yum search memcached 安装memcache yum -y install memcachedMemcache关联php yum -y install php-pec ...
- JavaScript_10_错误
Try...catch... throw <!DOCTYPE html> <html> <head> <title></title> < ...
- URAL 1057 Amount of Degrees (数位DP,入门)
题意: 求给定区间[X,Y]中满足下列条件的整数个数:这个数恰好等于K个互不相等的,B的整数次幂之和.例如,设X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足了要求: 17 = 24+2 ...
- [CV笔记]OpenCV机器学习笔记
KNN算法: 目的是分类,具体过程为,先训练,这个训练我估计只是对训练数据进行一个存储,knn测试的过程是根据测试样例找出与这个样例的距离最近的k个点,看这k个点中哪个分类所占的比例比较多,那么这个样 ...
- superset docker 部署
公众号原文有更多效果图哦 一.使用自己的数据库 1. 拉取项目 // 创建目录用于存放项目 mkdir -p /mnt/superset cd /mnt/superset git clone http ...