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$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久 ...
随机推荐
- ruby 正则表达式 ruby-doc原文
原文链接:http://www.ruby-doc.org/core-1.9.3/Regexp.html Regexp A Regexp holds a regular expression, used ...
- Java基础学习_01 概述及环境配置
一.概述 1.Java语言平台版本 1.1J2SE(Java 2 Platform Standard Edition)标准版 为开发普通桌面和商务应用程序提供的解决方案,该技术体系是其他两者的基础,可 ...
- 介绍我最近做的网站 Asp.Net MVC4 + BootStrap
一.前言 最近一直在做一个多站SEO数据分析的站点(www.easyyh.com),用了一些新技术,如Asp.Net MVC4,BootStrap,EasyUI,这些都是以前没有搞过的,最近搞得差不多 ...
- Mybatis 使用注解和Provider类实现动态条件查询
1.注解内拼写 Mybatis SQL 脚本 @Repository public interface CustomerFeedMapper extends BaseCrudMapper<Cus ...
- c# ExpandoObject动态扩展对象
js中的Object 对象. php中的stdClass. c# 也有动态可扩展对象 ExpandoObject,需要添加System.Dynamic引用 用法: dynamic model = ne ...
- js浮点数乘除法
JS在处理浮点数计算时经常会遇到精度的问题,上一篇博客封装了JS浮点数加减法的方法,这一次来封装一下js浮点数乘除法运算. 其实浮点除法的封装跟加减法的封装原理是一样,只是在第一次计算完后会再复位小数 ...
- 洛谷P1435 回文字串(dp)
题意 题目链接 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成回文词.此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数. 比如 “Ab3bd”插入2个字符后可 ...
- 巧用伪元素绘制带边的三角形--CSS3
<!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...
- ES6学习(1)
let 和 const 命令 ES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效.for循环的计数器,就很合适使用let命令. 下面的代码 ...
- python(一)
1 python安装 先安装python,之后安装pycharm 创建工程时需要关联解释器路径: 2 python运行 先编译后解释 .py--.pyc文件---解析----结果 .pyc的目的是减少 ...