*HDU2852 树状数组(求第K小的数)

KiKi‘s K-Number

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3864    Accepted Submission(s): 1715

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

题意:

有三种操作:0 a,将a加入容器,1 a 将a从容器中删去,2 a b 求大于a的第b个数。

代码:

 1 //求大于a的第k个数就是求第sum(a)+k小的数。二分求第k小数。
 2 #include<iostream>
 3 #include<cstdio>
 4 #include<cstring>
 5 using namespace std;
 6 int A[100005];
 7 int m;
 8 int lowbit(int x)
 9 {
10     return x&(-x);
11 }
12 void add(int id,int val)
13 {
14     while(id<=100000)
15     {
16         A[id]+=val;
17         id+=lowbit(id);
18     }
19 }
20 int sum(int id)
21 {
22     int s=0;
23     while(id>0)
24     {
25         s+=A[id];
26         id-=lowbit(id);
27     }
28     return s;
29 }
30 int main()
31 {
32     int a,b,p;
33     while(scanf("%d",&m)!=EOF)
34     {
35         memset(A,0,sizeof(A));
36         for(int i=0;i<m;i++)
37         {
38             scanf("%d",&p);
39             if(p==0)
40             {
41                 scanf("%d",&a);
42                 add(a,1);
43             }
44             else if(p==1)
45             {
46                 scanf("%d",&a);
47                 if(sum(a)-sum(a-1)==0)
48                 printf("No Elment!\n");
49                 else add(a,-1);
50             }
51             else if(p==2)
52             {
53                 scanf("%d%d",&a,&b);
54                 int tem=sum(a);
55                 if(sum(100000)-tem<b)
56                 {
57                     printf("Not Find!\n");
58                     continue;
59                 }
60                 tem+=b;
61                 int lef=1,rig=100000,mid;
62                 while(lef+1<rig)        //二分结束条件!!!!!!!
63                 {
64                     mid=(lef+rig)>>1;
65                     int num=sum(mid);
66                     if(num>=tem) rig=mid;
67                     else lef=mid;
68                 }
69                 printf("%d\n",rig);
70             }
71         }
72     }
73     return 0;
74 }
时间: 2024-08-24 14:21:00

*HDU2852 树状数组(求第K小的数)的相关文章

树状数组求第K小值 (spoj227 Ordering the Soldiers &amp;&amp; hdu2852 KiKi&#39;s K-Number)

题目:http://www.spoj.com/problems/ORDERS/ and http://acm.hdu.edu.cn/showproblem.php?pid=2852 题意:spoj227:告诉每个位置前面有多少个数比当前位置小,求出原序列.hdu2852:设计一个容器,支持几种操作:增加/删除元素,求容器中比a大的数中第k小的数是多少. 分析:两个题思路都是求数组里面的第K小的数.开始一直在找O(N*logN)的方法,后来发现O(N*logN*logN)也是可以过的...两步:和

hdu 2985 The k-th Largest Group 树状数组求第K大

The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8353   Accepted: 2712 Description Newman likes playing with cats. He possesses lots of cats in his home. Because the number of cats is really huge, Newman wants to g

hdu2852 KiKi&#39;s K-Number 树状数组求第k大数

//再求第k大数时只需要getsum(b-1)<getsum(a)+k<=getsum(b) //b就是a的第k大数 //又gesum(b-1)<=getsum(b)则可以用二分查找来做 #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int maxn=100010; int tree[maxn]; int lowbit(int i) {

HDU 5249 离线树状数组求第k大+离散化

KPI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1160    Accepted Submission(s): 488 Problem Description 你工作以后, KPI 就是你的全部了. 我开发了一个服务,取得了很大的知名度.数十亿的请求被推到一个大管道后同时服务从管头拉取请求.让我们来定义每个请求都有一个重要值.我的

POJ2985 The k-th Largest Group[树状数组求第k大值 并查集]

The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8807   Accepted: 2875 Description Newman likes playing with cats. He possesses lots of cats in his home. Because the number of cats is really huge, Newman wants to g

zoj 3635 Cinema in Akiba (树状数组求第K大)

Cinema in Akiba Cinema in Akiba (CIA) is a small but very popular cinema in Akihabara. Every night the cinema is full of people. The layout of CIA is very interesting, as there is only one row so that every audience can enjoy the wonderful movies wit

HDU 2852 (树状数组+无序第K小)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2852 题目大意:操作①:往盒子里放一个数.操作②:从盒子里扔掉一个数.操作③:查询盒子里大于a的第K小数. 解题思路: 由于模型是盒子,而不是序列,所以可以用树状数组的顺序维护+逆序数思想. 对应的树状数组Solution: 放一个数 $Add(val,1)$ 类似维护逆序数的方法,对应位置上计数+1. 删一个数 判断:$getSum(val)-getSum(val-1)=0$ 可以Hash处理,但

树状数组求第K大(From CLJ)

int ret=0; for(int p=1<<log2[n];p;p>>=1) if(a[ret+p]<=kth) kth-=a[ret+=p]; return ret;

【转载】【树状数组区间第K大/小】

原帖:http://www.cnblogs.com/zgmf_x20a/archive/2008/11/15/1334109.html 回顾树状数组的定义,注意到有如下两条性质: 一,c[ans]=sum of A[ans-lowbit(ans)+1 ... ans];二,当ans=2^k时, c[ans]=sum of A[1 ... ans]; 下面说明findK(k)如何运作:1,设置边界条件ans,ans'<maxn且cnt<=k:2,初始化cnt=c[ans],其中ans=2^k且k