[HDU - 2852] KiKi's K-Number (树状数组+二分)
链接
http://acm.hdu.edu.cn/showproblem.php?pid=2852
题意
现在需要你对一个空序列做nnn次操作,操作分三种
- 0x0\ \ x0 x :向序列中加入一个xxx;
- 1x1\ \ x1 x :删除序列中的数xxx,如果xxx不存在,输出
No Elment!
; - 2xk2\ \ x\ \ k2 x k :查找大于xxx的第kkk大元素,输出它,如果不存在输出
Not Find!
分析
线段树或者树状数组;
这里使用树状数组,首先将所有xxx读入并离散化(所以下面说的xxx,都是离散化后的xxx,其实不离散应该也可以,数据不大),之后对于插入操作(0,x)(0,\ x)(0, x)直接在xxx位置插入一个111即可,对于删除操作(1,x)(1,\ x)(1, x),判断xxx是否存在只需要判断sum(x)−sum(x−1)sum(x)\ -\ sum(x\ -1)sum(x) − sum(x −1)是否等于0,等于0说明不存在,否则存在;
对于(2,x,k)(2,\ x,\ k)(2, x, k)操作,我们先判断是否存在大于xxx的第kkk大元素,实际上这就是需要我们判断大于xxx的元素是否有kkk个,如果大于xxx的数的个数小于kkk,那显然不存在第kkk大元素,而判断大于xxx的元素是否有kkk个,只需判断sum(len)−sum(x)sum(len)\ -\ sum(x)sum(len) − sum(x)是否小于kkk,lenlenlen为树状数组的最大长度或者是一个很大的数也可以(当然不能越界),若大于等于说明存在大于xxx的第kkk大元素,之后根据sumsumsum的取值二分即可,最后可以找到一个满足sum(pos)−sum(x)sum(pos)\ -\ sum(x)sum(pos) − sum(x) == kkk的pospospos值,这个pospospos值即为答案(没离散即答案为pospospos,否则还需要反向查找原来的数);
代码
#include <functional>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <set>
#include <map>#define INF 0x7f7f7f7f
#define MAXN 100005
#define N 200005
#define P 2
#define MOD 99991typedef long long ll;namespace fastIO {//#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1<<22, stdin), p1 == p2) ? EOF : *p1++)//char buf[(1 << 22)], *p1 = buf, *p2 = buf;inline int read() {char c = getchar(); int x = 0, f = 1;while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar(); }while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f;}
}using namespace fastIO;
using namespace std;struct Op {int ope, a, k;
}o[MAXN];int n, t[MAXN], b[MAXN], len;inline void insert(int x, int val) {for (int i = x; i <= len + 2; i += i & -i)t[i] += val;
}inline int sum(int x) {if (x <= 0)return 0;int res = 0;for (int i = x; i > 0; i -= i & -i)res += t[i];return res;
}
int main() {while (scanf("%d", &n)!=EOF) {int cnt = 0;memset(t, 0, sizeof(t));for (int i = 1; i <= n; i++) {o[i].ope = read();o[i].a = read();b[++cnt] = o[i].a;if (o[i].ope == 2) o[i].k = read();}sort(b + 1, b + 1 + cnt);len = unique(b + 1, b + 1 + cnt) - b - 1;for (int i = 1; i <= n; i++) {if (o[i].ope == 0) {int pos = lower_bound(b + 1, b + 1 + len, o[i].a) - b;//cout << o[i].a << " " << pos << endl;insert(pos, 1);}else if (o[i].ope == 1) {int pos = lower_bound(b + 1, b + 1 + len, o[i].a) - b;if (sum(pos) - sum(pos - 1) == 0)cout << "No Elment!" << endl;else insert(pos, -1);}else {int pos = lower_bound(b + 1, b + 1 + len, o[i].a) - b;int x = sum(pos);if (sum(len) - sum(pos) < o[i].k)cout << "Not Find!" << endl;else {int l = 0, r = len + 1;while (l < r - 1) {int mid = (l + r) >> 1;if (sum(mid) - x >= o[i].k) r = mid;else l = mid;}cout << b[r] << endl;}}}}
}
[HDU - 2852] KiKi's K-Number (树状数组+二分)相关推荐
- 树状数组 + 二分 - Query HDU - 4339
树状数组 + 二分 - Query HDU - 4339 题意: T组测试用例,每组给定两个长度分别为l1和l2的字符串s1,s2.有两种询问:①.1idic:将第id个字符串的第i个字符变成字符c. ...
- VK Cup 2012 Qualification Round 2 C. String Manipulation 1.0 线段树 or 树状数组+二分
http://codeforces.com/problemset/problem/159/C 题意: 给你一个字符串s,给出一个数k,k倍的s串组成新串str.然后给出n个操作,每个操作对应着pi,c ...
- P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]
题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...
- POJ2828 Buy Tickeys 树状数组+二分 线段树留坑。。。
题意:一堆人排队买票,告诉你一堆人的序号(序号的意思是插在"当前"第几个人的后面)和姓名(姓名用编号代替). 思路:线段树 或 树状数组+二分(自己还不会线段树,所以这里继续留坑) ...
- HDU 2852 KiKi's K-Number (树状数组+二分)
题意: 给出一些操作: 0 x 在数组中加入一个数x 1 x 在数组中去掉一个数x 2 a k 在数组中查询比a大的第k小数 分析: 首先看到题目的数据范围 e<100000 ,发现数组完全可以 ...
- hdu 2852 KiKi's K-Number (线段树)
版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 2852 题意: 一个容器,三种操作: (1) 加入一个数 e (2) 删除一个数 e,如果不存在则输出 No Elment! (3) 查 ...
- HDU - 1394 Minimum Inversion Number(树状数组)
题目链接:点击查看 题目大意:线段树求逆序数,给出的数列可以组成环,问怎么样求可以让逆序数最小,输出最小值 题目分析:看到这个题的第一反应是暴力枚举5000种情况,因为感觉这个题的N给的不是很大,但是 ...
- hdu-2852 KiKi's K-Number---二分+树状数组
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2852 题目大意: 题意: 给出三种操作, 0 在容器中插入一个数. 1 在容 ...
- hdu 4911 求逆序对数+树状数组
http://acm.hdu.edu.cn/showproblem.php?pid=4911 给定一个序列,有k次机会交换相邻两个位置的数,问说最后序列的逆序对数最少为多少. 实际上每交换一次能且只能 ...
最新文章
- 百度云「升级战」:王海峰站台,新架构全面AI化,AI和知识中台登场
- 手机技巧:手机用一段时间就发烫,如何解决?
- Kerberos:cannot get master principle
- 切图后用ie6浏览时切片间有空隙
- c语言二叉树的构造输出,C语言数据结构树状输出二叉树,谁能给详细的解释一下...
- Python入门学习笔记(6)
- Rank() 、DENSE_RANK()、NTILE(n)的用法-转
- JPL星历文件de405下载方法
- 服务器sas系统盘损坏,磁盘阵列中SCSI、SAS硬盘由于一块或者多块有坏道引起操作系统产生如下故障...
- 编写程序输入年利率k(例如2.52%),存款总额total(例如100000元),计算一年后的本息并输出。
- 参考线平滑-FemPosDeviation-SQP
- 深兰科技亮相2022世界人工智能大会:AI创新,共话未来城市建设
- 2021年1月编程语言排行榜(C语言又第一名)
- C语言学习笔记(十五)
- 《Linux指令从入门到精通》——4.2 Linux下的简单文字模式文本编辑器
- “PS”制作海报总结(一)
- 利用二维数组实现一个矩阵类:Matrix
- 01654报错: 索引无法通过8扩展
- 为什么两台电脑互连怎么一边能ping通在一边却ping不通
- CAM350 常用快捷键及简单操作问题