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$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久 ...
随机推荐
- windows 安装 jdk1.8并配置环境变量
1.查看电脑环境 我的电脑--右键--属性 2.下载jdk1.8 网址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-do ...
- 在开发第一个Android应用之前需要知道的5件事:
你能否详细讲述一下,在开发Android应用过程中每一阶段要用到的技能和编程语言? 建立一个Android应用程序可以归结为两个主要技能/语言:Java和Android系统.Java是Android的 ...
- httpHelper请求辅助类
#import <Foundation/Foundation.h> #import "AFNetworking.h" @interface AFHttpClient : ...
- GIT新手入门学习教程
廖雪峰的GIT教程 链接地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
- LR脚本示例之常用函数
1.变量和参数的设置 //将IP地址和端口放入到参数中lr_save_string("127.0.0.1:1080","ip"); //退出脚本建议使用lr_e ...
- Protocol Buffer学习教程之编译器与类文件(三)
Protocol Buffer学习教程之编译器与类文件(三) 1. 概述 在前面两篇中,介绍了Protobuf的基本概念.应用场景.与protobuf的语法等.在此篇中将介绍如何自己编译protobu ...
- redmine安装详解
1.Linux:centos6.4(32位)2.Gcc的编译环境.使用make命令编辑.yum install gcc-c++ 3.PCRE PCRE(Perl Compatible Regular ...
- HDU 5489 Removed Interval (LIS,变形)
题意: 给出一个n个元素的序列,要求从中删除任一段长度为L的连续子序列,问删除后的LIS是多少?(n<=10w, L<=n ,元素可能为负) 思路: 如果会O(nlogn)求普通LIS的算 ...
- COGS 1715. [CQOI2011]动态逆序对
★★★ 输入文件:inverse.in 输出文件:inverse.out 简单对比时间限制:2 s 内存限制:128 MB [题目描述] 对于序列A,它的逆序对数定义为满足i<j ...
- JS中作用域和变量提升(hoisting)的深入理解
作用域(Scoping) javascript作用域之所以迷惑,是因为它程序语法本身长的像C家族的语言.我对作用域的理解是只会对某个范围产生作用,而不会对外产生影响的封闭空间.在这样的一些空间里,外部 ...