题目链接: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. @ifconfig eth0|awk -F "[ :]+" 'NR==2{print $4 "/" $NF}'中"[ :]+" 是什么意思?@

    http://blog.csdn.net/zhuying_linux/article/details/6822987

  2. sql server 本地复制订阅 实现数据库服务器 读写分离(转载)

    转载地址:http://www.cnblogs.com/echosong/p/3603270.html 再前段echosong 写了一遍关于mysql 数据同步实现业务读写分离的文章,今天咱们来看下S ...

  3. LSM-Tree (BigTable 的理论模型)(转)

    Google的BigTable架构在分布式结构化存储方面大名鼎鼎,其中的MergeDump模型在读写之间找到了一个较好的平衡点,很好的解决了web scale数据的读写问题. MergeDump的理论 ...

  4. java BigInteger使用

    虽然说我不怎么会用java写一些东西,但是java里的biginteger我还是很喜欢的.这个类解决了,我们在其他很多语言中遇到的问题:大数.比如在C++中我们要计算一个大小超过long long的数 ...

  5. [Spring] 事务级别定义

    记录下来,以后备用 //事务传播属性 @Transactional(propagation=Propagation.REQUIRED)//如果有事务,那么加入事务,没有的话新创建一个 @Transac ...

  6. JAVA的容器---List,Map,Set (转)

    JAVA的容器---List,Map,Set Collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashM ...

  7. 虚拟机下玩DXF

    DXF检测虚拟机好象已经很长时间了,记得当时也是在网上找的教程,今天无聊又检测了一下,发现目前依然有效.用记事本打开 虚拟机启动文件 xxxx.vmx 在最后添加如下两行代码monitor_contr ...

  8. 小甲鱼PE详解之IMAGE_DOS_HEADER结构定义即各个属性的作用(PE详解01)

    (注:最左边是文件头的偏移量.) IMAGE_DOS_HEADER STRUCT {  +0h  WORD  e_magic  // Magic DOS signature MZ(4Dh 5Ah)   ...

  9. string、math、random、datetime类

    1.string类 变量.Replace("想要替换掉的字符或字符串","转换后的字符或字符串");//替换 练习:判断邮箱格式是否正确            ...

  10. Liferay 6.2 改造系列之十三:修改用户编辑页面表单内容

    为简化用户编辑,删除无用内容: 在/portal-master/portal-impl/src/portal.properties文件中,有如下配置: # # Input a list of sect ...