链接

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 (树状数组+二分)相关推荐

  1. 树状数组 + 二分 - Query HDU - 4339

    树状数组 + 二分 - Query HDU - 4339 题意: T组测试用例,每组给定两个长度分别为l1和l2的字符串s1,s2.有两种询问:①.1idic:将第id个字符串的第i个字符变成字符c. ...

  2. 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 ...

  3. P2161 [SHOI2009]会场预约[线段树/树状数组+二分/STL]

    题目描述 PP大厦有一间空的礼堂,可以为企业或者单位提供会议场地.这些会议中的大多数都需要连续几天的时间(个别的可能只需要一天),不过场地只有一个,所以不同的会议的时间申请不能够冲突.也就是说,前一个 ...

  4. POJ2828 Buy Tickeys 树状数组+二分 线段树留坑。。。

    题意:一堆人排队买票,告诉你一堆人的序号(序号的意思是插在"当前"第几个人的后面)和姓名(姓名用编号代替). 思路:线段树 或 树状数组+二分(自己还不会线段树,所以这里继续留坑) ...

  5. HDU 2852 KiKi's K-Number (树状数组+二分)

    题意: 给出一些操作: 0 x 在数组中加入一个数x 1 x 在数组中去掉一个数x 2 a k 在数组中查询比a大的第k小数 分析: 首先看到题目的数据范围 e<100000 ,发现数组完全可以 ...

  6. hdu 2852 KiKi's K-Number (线段树)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 2852 题意: 一个容器,三种操作: (1) 加入一个数 e (2) 删除一个数 e,如果不存在则输出 No Elment! (3) 查 ...

  7. HDU - 1394 Minimum Inversion Number(树状数组)

    题目链接:点击查看 题目大意:线段树求逆序数,给出的数列可以组成环,问怎么样求可以让逆序数最小,输出最小值 题目分析:看到这个题的第一反应是暴力枚举5000种情况,因为感觉这个题的N给的不是很大,但是 ...

  8. hdu-2852 KiKi's K-Number---二分+树状数组

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2852 题目大意: 题意:     给出三种操作,     0 在容器中插入一个数.     1 在容 ...

  9. hdu 4911 求逆序对数+树状数组

    http://acm.hdu.edu.cn/showproblem.php?pid=4911 给定一个序列,有k次机会交换相邻两个位置的数,问说最后序列的逆序对数最少为多少. 实际上每交换一次能且只能 ...

最新文章

  1. 百度云「升级战」:王海峰站台,新架构全面AI化,AI和知识中台登场
  2. 手机技巧:手机用一段时间就发烫,如何解决?
  3. Kerberos:cannot get master principle
  4. 切图后用ie6浏览时切片间有空隙
  5. c语言二叉树的构造输出,C语言数据结构树状输出二叉树,谁能给详细的解释一下...
  6. Python入门学习笔记(6)
  7. Rank() 、DENSE_RANK()、NTILE(n)的用法-转
  8. JPL星历文件de405下载方法
  9. 服务器sas系统盘损坏,磁盘阵列中SCSI、SAS硬盘由于一块或者多块有坏道引起操作系统产生如下故障...
  10. 编写程序输入年利率k(例如2.52%),存款总额total(例如100000元),计算一年后的本息并输出。
  11. 参考线平滑-FemPosDeviation-SQP
  12. 深兰科技亮相2022世界人工智能大会:AI创新,共话未来城市建设
  13. 2021年1月编程语言排行榜(C语言又第一名)
  14. C语言学习笔记(十五)
  15. 《Linux指令从入门到精通》——4.2 Linux下的简单文字模式文本编辑器
  16. “PS”制作海报总结(一)
  17. 利用二维数组实现一个矩阵类:Matrix
  18. 01654报错: 索引无法通过8扩展
  19. 为什么两台电脑互连怎么一边能ping通在一边却ping不通
  20. CAM350 常用快捷键及简单操作问题

热门文章

  1. 如何利用漏斗模型增加转化率减少流失率?
  2. 数据可视化之数据的图表呈现
  3. 如何区分电脑上的硬件和软件?
  4. javaweb—web环境搭建
  5. 河南单招计算机分数线,2019年河南单招分数线一般多少分
  6. Uncaught TypeError: XXX is not a function问题解决
  7. 高通打开内核阶段串口log
  8. Java自学第6期——Collection、Map、迭代器、泛型、可变参数、集合工具类、集合数据结构、Debug
  9. 产品经理必懂的技术那点事儿(中)
  10. centos8 修改root密码