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$大的元素是哪一个 题解: 写法很多,主席树是最常用的一种之一 除此之外有:划分树,莫队分块,平衡树等 主席树的定义其实挺模糊, 一般认为就是可持久 ...
随机推荐
- .net创建activex实现摄像头拍照
using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices ...
- jQuery知识点小结
博主之前学习一段时间后做了点Demo,借此机会发出来分享,其实学jQuery只要简单看看文档即可,但有些细枝末节的东西文档会默认使用者是了解的,所以还是得系统学习系统训练:Talk is cheap, ...
- 《Ionic 2 实例开发》发布
Ionic 2系列教程集结成册,在百度阅读上架发布,名为<Ionic 2实例开发>(点击书名将打开地址:http://yuedu.baidu.com/ebook/ba1bca51e4189 ...
- Swing---WindowConstants
Java桌面开发过程中,很多人都写过类似下面的代码. import javax.swing.JFrame; public class SimpleFrame { public static void ...
- android app 压力测试工具-monkey tool
一.什么是Monkey? Monkey测试是Android自动化测试的一种手段,Monkey测试本身非常简单,就是模拟用户的按键输入,触摸屏输入,手势输入等,看设备多长时间会出异常. Monkey是A ...
- 【LeetCode】4.Median of Two Sorted Arrays 两个有序数组中位数
题目: There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the ...
- POJ Charlie's Change 查理之转换(多重背包,变形)
题意: 给定身上的4种硬币,分别是1 ,5 ,10, 25面额各有多张,要求组成面额p的硬币尽可能多.输出组成p的4种硬币各自的数量. 思路: 多重背包,300+ms.用01背包+二进制的方法.记录下 ...
- 使用tensorflow object_detection API训练自己的数据遇到的问题及解决方法
1.Windows下出现找不到object_detection包的问题. 解决方法 在Anaconda3\soft\Lib\site-packages新建一个pth文件,将PedestrianDete ...
- fastjson中转字符串时格式化、显示null值等
fastjson中object转string时的配置项,包括 1. 是否显示value为null的项 2. 是否格式化显示字符串 3. 日期是否格式化显示为可读字符串 ... 这些的配置均在Seria ...
- java8关于LocalDate,Date
关于java8中的新的时间日期类 public static void main(String[] args) { Date date = new Date(); LocalDate localDat ...