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

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=2852

题目大意:

题意:
    给出三种操作,
    0 在容器中插入一个数。
    1 在容器中删除一个数。
    2 求出容器中大于a的第k大元素。

解题思路:

用树状数组维护每个值,插入数字是add(x, 1),删除时add(x, -1)

查询第k大时,先判断是否存在,存在的话直接根据树状数组sum值的单调性二分法求解即可

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<string>
 5 #include<map>
 6 #include<set>
 7 #include<cmath>
 8 #include<algorithm>
 9 #include<vector>
10 #include<sstream>
11 #define lowbot(i) (i&(-i))
12 using namespace std;
13 typedef long long ll;
14 const int maxn = 1e5 + 10;
15 int tree[maxn];
16 void add(int x, int d)
17 {
18     while(x <= 100000)
19         tree[x] += d, x += lowbot(x);
20 }
21 int sum(int x)
22 {
23     int ans = 0;
24     while(x)ans += tree[x], x -= lowbot(x);
25     return ans;
26 }
27 int Find(int x, int k)
28 {
29     int l = x + 1, r = 100000;
30     int mid, t;
31     while(l < r)
32     {
33         //cout<<l<<" "<<r<<endl;
34         mid = (l + r) / 2;
35         t = sum(mid) - sum(x);
36         if(t >= k)
37             r = mid;
38         else l = mid + 1;
39     }
40     return r;
41 }
42 int main()
43 {
44     int n, x, k;
45     while(scanf("%d", &n) != EOF)
46     {
47         memset(tree, 0, sizeof(tree));
48         while(n--)
49         {
50             scanf("%d", &x);
51             if(x == 0)
52             {
53                 scanf("%d", &x);
54                 add(x, 1);
55             }
56             else if(x == 1)
57             {
58                 scanf("%d", &x);
59                 if(sum(x) == sum(x - 1))
60                     printf("No Elment!\n");
61                 else add(x, -1);
62             }
63             else if(x == 2)
64             {
65                 scanf("%d%d", &x, &k);
66                 if(sum(100000) - sum(x) < k)
67                     printf("Not Find!\n");
68                 else
69                 {
70                     printf("%d\n", Find(x, k));
71                 }
72             }
73         }
74     }
75     return 0;
76 }

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

原文地址:https://www.cnblogs.com/fzl194/p/8955062.html

时间: 2024-10-10 07:13:45

hdu-2852 KiKi's K-Number---二分+树状数组的相关文章

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 1394 Minimum Inversion Number (裸树状数组 求逆序数)

题目链接 题意: 给一个n个数的序列a1, a2, ..., an ,这些数的范围是0-n-1, 可以把前面m个数移动到后面去,形成新序列:a1, a2, ..., an-1, an (where m = 0 - the initial seqence)a2, a3, ..., an, a1 (where m = 1)a3, a4, ..., an, a1, a2 (where m = 2)...an, a1, a2, ..., an-1 (where m = n-1)求这些序列中,逆序数最少的

【51nod】 第K大区间2(二分+树状数组)

[51nod] 第K大区间2(二分+树状数组) 第K大区间2 ﹡    LH (命题人) 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值 [1]:3 [2]:1 [3]:2 [4]:4 [1,3]:2 [2,4]:2 第三大是2 Input 第一行两个数n和k(1<=n<=100000,k&l

【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. Input 第一行N,M 接下来M行,每行形如1 a b c或2 a b c Output 输出每个询问的结果 Sample Input 2 5 1 1 2 1 1 1 2 2 2 1 1 2 2 1 1 1 2 1 2 3 Sample Output 1 2 1 HINT

【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. 输入 第一行N,M接下来M行,每行形如1 a b c或2 a b c 输出 输出每个询问的结果 样例输入 2 5 1 1 2 1 1 1 2 2 2 1 1 2 2 1 1 1 2 1 2 3 样例输出 1 2 1 题解 整体二分+树状数组区间修改 当年naive的树套树题解 前两天由于要

HDU 2227 Find the nondecreasing subsequences (DP+树状数组+离散化)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2227 Find the nondecreasing subsequences                                  Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)                                             

【BZOJ-2527】Meteors 整体二分 + 树状数组

2527: [Poi2011]Meteors Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 831  Solved: 306[Submit][Status][Discuss] Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby galaxy. The planet is unsuitable for colo

HDU 4417 类似求逆序数的树状数组

Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2250    Accepted Submission(s): 1092 Problem Description Mario is world-famous plumber. His “burly” figure and amazing jumping ability

HDU 4267 A Simple Problem with Integers (树状数组)

A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Description Let A1, A2, ... , AN be N elements. You need to deal with two kinds of operations. One type of operation is to add a given

11525 - Permutation(二分+树状数组)

题目链接:点击打开链接 题意:从1~k的所有排列中找到第n个排列, n由公式给出. 思路:可以发现, 这个公式就是康托展开公式(康托展开百科:点击打开链接). 那么s[i]的意思就是i个数中当前数排在第几. 如此, 可以用二分+树状数组快速求解, 和一道BC题目神似. 细节参见代码: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<st