HDUOJ-----2852 KiKi's K-Number(树状数组+二分)
KiKi's K-Number
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2393 Accepted Submission(s): 1101
Problem Description
For the k-th number, we all should be very familiar with it. Of course,to kiki it is also simple. Now Kiki meets a very similar problem, kiki wants to design a container, the container is to support the three operations. Push: Push a given element e to container Pop: Pop element of a given e from container Query: Given two elements a and k, query the kth larger number which greater than a in container; Although Kiki is very intelligent, she can not think of how to do it, can you help her to solve this problem?
Input
Input some groups of test data ,each test data the first number is an integer m (1 <= m <100000), means that the number of operation to do. The next m lines, each line will be an integer p at the beginning, p which has three values: If p is 0, then there will be an integer e (0 <e <100000), means press element e into Container. If p is 1, then there will be an integer e (0 <e <100000), indicated that delete the element e from the container If p is 2, then there will be two integers a and k (0 <a <100000, 0 <k <10000),means the inquiries, the element is greater than a, and the k-th larger number.
Output
For each deletion, if you want to delete the element which does not exist, the output "No Elment!". For each query, output the suitable answers in line .if the number does not exist, the output "Not Find!".
Sample Input
5 0 5 1 2 0 6 2 3 2 2 8 1 7 0 2 0 2 0 4 2 1 1 2 1 2 2 1 3 2 1 4
Sample Output
No Elment! 6 Not Find! 2 2 4 Not Find!
Source
2009 Multi-University Training Contest 4 - Host by HDU
这道题是一题,题意是要找a的第k大的数,由于想到树状数组,也有这么一种解法,所以就拿来练练手,首先采用传统的树状数组上升模式,进行
累加和,不过这里的和表示的是比a比大的个数,所以在我们查询的时候只要将要查找的的数sum(val)-sum(a)==k来进行二分,当然由于数据是离散的,而我们这里有无法进行离散化处理,因此我们只需要加入一个辅助数组lab[],进行判断就可以了.....这道题,第一次遇到可算是想了一段时间,毕竟是个菜鸟....做出来还是很幸福的说....
代码如下:
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4 #define maxn 100000
5 #define lowbit(x) ((x)&(-x))
6 int aa[maxn+3];
7 int lab[maxn+3];
8 void ope(int x,int val)
9 {
10 while(x<=maxn)
11 {
12 aa[x]+=val;
13 x+=lowbit(x);
14 }
15 }
16 int cont(int x)
17 {
18 int ans=0;
19 while(x>0)
20 {
21 ans+=aa[x];
22 x-=lowbit(x);
23 }
24 return ans;
25 }
26 int main()
27 {
28 int n,p,a,k;
29 int left,right,mid,res;
30 bool tag=true;
31 // freopen("test.in","r",stdin);
32 //freopen("test.out","w",stdout);
33 while(scanf("%d",&n)!=EOF)
34 {
35 memset(aa,0,sizeof(aa));
36 memset(lab,0,sizeof(lab));
37 while(n--)
38 {
39 scanf("%d",&p);
40 if(p==2)
41 {
42 scanf("%d%d",&a,&k);
43 left=a, right=maxn;
44 tag=true;
45 while(left<=right)
46 {
47 mid=left+(right-left)/2;
48 res=cont(mid)-cont(a);
49 if(res<k)
50 left=mid+1;
51 else if(res-lab[mid]>=k)
52 right=mid-1;
53 else
54 if(res>=k&&res-lab[mid]<k)
55 {
56 printf("%dn",mid);
57 tag=false;
58 break;
59 }
60 }
61 if(tag)
62 printf("Not Find!n");
63
64 }
65 else
66 {
67 scanf("%d",&a);
68 if(p==1)
69 {
70 if(lab[a]==0)
71 printf("No Elment!n");
72 else
73 {
74 lab[a]--;
75 ope(a,-1); //1代表insert
76 }
77 }
78 else
79 {
80 lab[a]++;
81 ope(a,1); //0代表elete
82 }
83 }
84 }
85 }
86 return 0;
87 }
并给出一些数据来帮助验证吧....
1 5
2 0 5
3 1 2
4 0 6
5 2 3 2
6 2 8 1
7 7
8 0 2
9 0 2
10 0 4
11 2 1 1
12 2 1 2
13 2 1 3
14 2 1 4
15 12
16 0 2
17 0 2
18 0 4
19 0 5
20 1 2
21 0 6
22 2 3 2
23 2 8 1
24 2 1 1
25 2 1 2
26 2 1 3
27 2 1 4
- go 并发处理脚本
- 生信菜鸟团博客2周年精选文章集(4)NCBI数据库的几个探索
- PHP 的前世今生
- 【直播】我的基因组49:Y染色体的SNV不能用常规流程来找?
- 【直播】我的基因组46:SNV突变(96种)频谱的制作
- 深入剖析-Oracle索引分支块的结构
- 【直播】我的基因组48:我可能测了一个假的全基因组
- 【直播】我的基因组47:测序深度和GC含量的关系
- 【直播】我的基因组47:测序深度和GC含量的关系
- SNV突变(96种)频谱的制作
- Golang语言社区--go语言执行cmd命令关机、重启等
- 【直播】我的基因组 45:SNV突变(6种)频谱的制作
- 【直播】我的基因组 44:比对文件画profile和heatmap图
- 做过1000遍RNA-seq的老司机告诉你如何翻车
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 数据分析入门系列教程-微博热点
- 数据分析入门系列教程-常用图表
- PyTorch中的model.zero_grad() vs optimizer.zero_grad()
- Flask 入门系列教程(四)
- 代码审计
- ELF文件格式的详解
- 一个开源的RTOS的Chibios的评测
- CS学习笔记 | 25、邮件防御
- CS学习笔记 | 26、杀毒软件
- Python-pymysql
- 我又踩坑了!如何为HttpClient请求设置Content-Type标头?
- 在CentOS7上安装开源Verilog仿真工具EpicSim
- 【CS学习笔记】27、applet渗透测试手法
- Python-WSGI接口
- CentOS7-Nginx配置Let's-Encrypt-SSL证书