题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2852

题目大意:操作①:往盒子里放一个数。操作②:从盒子里扔掉一个数。操作③:查询盒子里大于a的第K小数。

解题思路

由于模型是盒子,而不是序列,所以可以用树状数组的顺序维护+逆序数思想。

对应的树状数组Solution:

放一个数

$Add(val,1)$

类似维护逆序数的方法,对应位置上计数+1。

注意Add的while范围要写成$while(x<maxn)$

如果范围不是最大,那么会导致某些sum[x]不会被更新。

删一个数

判断:$getSum(val)-getSum(val-1)=0$

可以Hash处理,但是没有必要。如果没有val这个数,那么$getSum(val)=getSum(val-1)$是必然的。

删除:$Add(val,-1)$

即加上-1,撤销之前的操作。

查询

查询比较麻烦。

首先要判断$getSum(maxn-1)-getSum(val)>=k$

然后,将查询大于a的第K小数转化为大于1的第X+K小数。

其中$X=getSum(val)$。然后,对区间$[1,maxn]$进行二分。

二分处理手段比较特殊,主要是由于有重复的数,所以直接找出$\arg \min \limits_{mid} getSum(mid)=X+K$是不行的。

$getSum(mid)=X+K$有时候并不能二分找到。

解决方法是:

$\left\{\begin{matrix}
R=mid \quad (getSum(mid)<=X+K)\\
\\
L=mid \quad (other)
\end{matrix}\right.$

这样,如果没有二分到,会最近的最小R作为结果。

$ans=R$

代码

#include "cstdio"
#include "map"
#include "cstring"
#include "algorithm"
using namespace std;
#define LL long long
#define maxn 100005
LL sum[maxn];
int val,n,kth,cmd;
int lowbit(int x) {return x&(-x);}
LL getSum(int x)
{
LL ret=;
while(x>)
{
ret+=sum[x];
x-=lowbit(x);
}
return ret;
}
void update(int x,int s)
{
while(x<maxn)
{
sum[x]+=s;
x+=lowbit(x);
}
}
LL query(int a,int k)
{
LL low=getSum(a),res;
low+=k;
int l=,r=maxn-,m;
while(l<r-)
{
m=l+(r-l)/;
res=getSum(m);
if(res>=low) r=m;
else l=m;
}
return r;
}
int main()
{
//freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
memset(sum,,sizeof(sum));
for(int i=;i<=n;i++)
{
scanf("%d",&cmd);
if(cmd==)
{
scanf("%d",&val);
update(val,);
}
else if(cmd==)
{
scanf("%d",&val);
LL key=getSum(val)-getSum(val-);
if(key==) printf("No Elment!\n");
else update(val,-);
}
else
{
scanf("%d%d",&val,&kth);
if(getSum(maxn-)-getSum(val)<kth) printf("Not Find!\n");
else
{
LL ans=query(val,kth);
printf("%I64d\n",ans);
}
}
}
}
}

HDU 2852 (树状数组+无序第K小)的更多相关文章

  1. hdu 4217 Data Structure? 树状数组求第K小

    Data Structure? Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  2. 树状数组求第k小的元素

    int find_kth(int k) { int ans = 0,cnt = 0; for (int i = 20;i >= 0;i--) //这里的20适当的取值,与MAX_VAL有关,一般 ...

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

    题目:http://www.spoj.com/problems/ORDERS/ and pid=2852">http://acm.hdu.edu.cn/showproblem.php? ...

  4. UVA11525 Permutation[康托展开 树状数组求第k小值]

    UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...

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

    KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  6. hdu 2852 树状数组

    思路:加一个数e就用update(e,1).删除元素e就用update(e,-1).找比a大的第k大的元素就用二分查找. #include<iostream> #include<cs ...

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

    #include<iostream> #include<cstring> using namespace std; ; int tr[N]; int lowbit(int x) ...

  8. poj 2985 The k-th Largest Group 树状数组求第K大

    The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8353   Accepted ...

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

    原帖:http://www.cnblogs.com/zgmf_x20a/archive/2008/11/15/1334109.html 回顾树状数组的定义,注意到有如下两条性质: 一,c[ans]=s ...

随机推荐

  1. Python中带参装饰器理解

  2. Android 5.0 如何正确启用isLoggable(一)__使用详解

    转自:http://blog.csdn.net/yihongyuelan/article/details/46409389 isLoggable是什么 在Android源码中,我们经常可以看到如下代码 ...

  3. 【Javascript】IE8兼容 背景图片与a标签的onclick事件

    先说几句牢骚话. 虽然IE8比之IE6.7有很大的进步,但是在执行效率.兼容性上仍然有很多问题.被广大开发者喜爱的平台才是好平台. 可惜多亏当年盗版XP打开中国的计算机市场,IE作为一款捆绑软件仍然在 ...

  4. Shell编程基础教程6--shell函数

    6.shell函数    6.1.定义函数        简介:            shell允许将一组命令集或语句形成一个可用块,这些块成为shell函数        定义函数的格式      ...

  5. 证明tmult_ok的正确性

    csapp page124. practice problem 2.35 /* Determine whether arguments can be multiplied without overfl ...

  6. jqueryEasyUI:tabs扩展:给tabs组件绑定双击事件 分类: JqueryEasyUI 2014-09-29 14:36 537人阅读 评论(0) 收藏

    实现代码: $.extend($.fn.tabs.methods, { /** * 绑定双击事件 * @param {Object} jq * @param {Object} caller 绑定的事件 ...

  7. SimpleHashTable

    简单的Hash Table 实现,下次被问到,至少不是从0开始.不过笔试问这个毕竟不多. public struct Item<K, V> { public K Key { get; se ...

  8. Visual Studio 2015将在7月20号RTM

    (此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:用了3个多月的VS 2015终于要迎来RTM了,不过感觉有点淡淡的忧伤(为什么呢?请看 ...

  9. jBox使用记录

    1.不显示底部按钮,可以将buttons设置为buttons:{} 例:$.jBox.open("iframe:http://www.baidu.com", "百度一下& ...

  10. customTextbox

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.W ...