hdu 2852 KiKi's K-Number

L - KiKi‘s K-Number

Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Submit Status

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!

询问的时候,(a,k)

对a+1,10 0000区间进行二分

getnum(x)得到是大于等于x数的个数

所以我们要找到getnum(a+1)-getnum(mid)==k

并且使得mid最小,最小的mid-1就是比a大的第k个数

好题!!!

 1 #include<iostream>
 2 #include<string>
 3 #include<cstdio>
 4 #include<vector>
 5 #include<queue>
 6 #include<stack>
 7 #include<algorithm>
 8 #include<cstring>
 9 #include<stdlib.h>
10 #include<string>
11 #include<cmath>
12 using namespace std;
13 #define pb push_back
14 int p[101010],m,mm;
15 void update(int pos,int num){
16     while(pos>0){
17         p[pos]+=num;
18         pos-=pos&(-pos);
19     }
20 }
21 int getnum(int pos){
22     int sum=0;
23     while(pos<=100000){
24         sum+=p[pos];
25         pos+=pos&(-pos);
26     }
27     return sum;
28 }
29 void Find(int pos,int k){
30     int l=pos+1,r=100000,mid,mm=10000000,be=getnum(pos+1);
31     while(l<=r){
32         mid=(l+r)/2;
33         int tmp=be-getnum(mid);
34         if(tmp<k) l=mid+1;
35         else{
36             mm=min(mm,mid-1);
37             r=mid-1;
38         }
39     }
40     if(mm!=10000000) printf("%d\n",mm);
41     else printf("Not Find!\n");
42
43 }
44 int main(){
45      #ifndef ONLINE_JUDGE
46             freopen("input.txt","r" ,stdin);
47         #endif // ONLINE_JUDGE
48     while(cin>>m){
49         memset(p,0,sizeof(p));
50         while(m--){
51             int a,b,c;
52             scanf("%d",&a);
53             if(a==0){
54                 scanf("%d",&b);
55                 update(b,1);
56             }
57             if(a==1){
58                 scanf("%d",&b);
59                 if(getnum(b)-getnum(b+1)>0) update(b,-1);
60                 else printf("No Elment!\n");
61             }
62             if(a==2){
63                 scanf("%d%d",&b,&c);
64                 Find(b,c);
65             }
66        }
67     }
68 }

hdu 2852 KiKi's K-Number,布布扣,bubuko.com

hdu 2852 KiKi's K-Number

时间: 2024-10-19 10:52:10

hdu 2852 KiKi's K-Number的相关文章

HDU 2852 KiKi&#39;s K-Number(动态过程求第K小数)

题意: 给出三种操作, 0 在容器中插入一个数. 1 在容器中删除一个数. 2 求出容器中大于a的第k大元素. 思路:可以用树状数组和线段树,显然a[1]+...+a[i]随i有明显的单调性,所以可以二分出答案 线段树时间复杂度比树状数组的常数大了几倍...所以线段树擦边过了 还有另外一种思路:二分只是二分出a[1]+...+a[i]的上界i,所以可以逆向考虑,从a[1]开始累加,直到到达k,这样的复杂度就由原来的 O(lgN*lgN) 变成O(lgN)了.难在累加的过程,线段树和树状数组是同样

HDU 2852 KiKi&#39;s K-Number(线段树+树状数组)

KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2603    Accepted Submission(s): 1202 Problem Description For the k-th number, we all should be very familiar with it. Of course,t

HDU 2852 KiKi&#39;s K-Number(树状数组+二分)

KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2598    Accepted Submission(s): 1199 Problem Description For the k-th number, we all should be very familiar with it. Of course,t

HDU 2852 KiKi&#39;s K-Number (树状数组 &amp;&amp; 二分)

题意:给出对容器的总操作次数n, 接下来是这n个操作.这里对于一个容器提供三种操作, 分别是插入.删除和查找.输入0  e表示插入e.输入1  e表示删除e,若元素不存在输出No Elment!.输入2  e  k表示查找比e大且第k大的数, 若不存在则输出Not Find! 分析:这里考虑树状数组做的原因是在第三个操作的时候, 只要我们记录了元素的总数, 那通过求和操作, 便能够高效地知道到底有多少个数比现在求和的这个数要大, 例如 tot - sum(3)就能知道整个集合里面比3大的数到底有

hdu 2852 KiKi&#39;s K-Number (线段树)

hdu 2852 题意: 一个容器,三种操作: (1) 加入一个数 e (2) 删除一个数 e,如果不存在则输出 No Elment! (3) 查询比a大的数中的第k小数,不存在就输出 Not Find! 解法: 关于第三点,可以先查询小于等于a的数的个数cnt,然后直接查询第cnt+k小数就行了 . 二分+树状数组 或者 主席树(有点杀鸡用牛刀的感觉 ...) 也是可以做的  _(:з」∠)_ code:线段树 1 #include <iostream> 2 #include <cst

HDU 2852 KiKi&#39;s K-Number【 树状数组 二分 】

题意:给出m个操作,0:是增加一个数,add(x,1)1:是删除一个指定的数,这个是看sum(x) - sum(x-1)是否为0,为0的话则不存在,不为0的话,则add(x,-1)2:是查询比x大的数中第k大的数,先求出比x小的个数s,假设比x大的数中第k大的数为y,那么比y小的个数有s+k个二分y的值来找 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath&g

hdu 2852(树状数组+二分)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2852 KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2668    Accepted Submission(s): 1227 Problem Description For the k-th number,

HDU 2147 —— kiki&#39;s game

kiki's game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 40000/10000 K (Java/Others) Problem Description Recently kiki has nothing to do. While she is bored, an idea appears in his mind, she just playes the checkerboard game.The size of th

HDU 4006 The kth great number (基本算法-水题)

The kth great number Problem Description Xiao Ming and Xiao Bao are playing a simple Numbers game. In a round Xiao Ming can choose to write down a number, or ask Xiao Bao what the kth great number is. Because the number written by Xiao Ming is too mu