HDU 2852 (树状数组+无序第K小)
题目链接: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小)的更多相关文章
- hdu 4217 Data Structure? 树状数组求第K小
Data Structure? Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 树状数组求第k小的元素
int find_kth(int k) { int ans = 0,cnt = 0; for (int i = 20;i >= 0;i--) //这里的20适当的取值,与MAX_VAL有关,一般 ...
- 树状数组求第K小值 (spoj227 Ordering the Soldiers && hdu2852 KiKi's K-Number)
题目:http://www.spoj.com/problems/ORDERS/ and pid=2852">http://acm.hdu.edu.cn/showproblem.php? ...
- UVA11525 Permutation[康托展开 树状数组求第k小值]
UVA - 11525 Permutation 题意:输出1~n的所有排列,字典序大小第∑k1Si∗(K−i)!个 学了好多知识 1.康托展开 X=a[n]*(n-1)!+a[n-1]*(n-2)!+ ...
- *HDU2852 树状数组(求第K小的数)
KiKi's K-Number Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdu 2852 树状数组
思路:加一个数e就用update(e,1).删除元素e就用update(e,-1).找比a大的第k大的元素就用二分查找. #include<iostream> #include<cs ...
- KiKi's K-Number HDU - 2852 树状数组+二分
#include<iostream> #include<cstring> using namespace std; ; int tr[N]; int lowbit(int x) ...
- poj 2985 The k-th Largest Group 树状数组求第K大
The k-th Largest Group Time Limit: 2000MS Memory Limit: 131072K Total Submissions: 8353 Accepted ...
- 【转载】【树状数组区间第K大/小】
原帖:http://www.cnblogs.com/zgmf_x20a/archive/2008/11/15/1334109.html 回顾树状数组的定义,注意到有如下两条性质: 一,c[ans]=s ...
随机推荐
- 《Thinking in Java》十七章_容器深入研究_练习14(Page486)
练习14 Properties的继承树如下:
- IE6中使用通用选择器模拟子选择器效果
IE6及更低版本不支持高级选择器:IE7有个bug,对于子选择器和相邻同胞选择器,如果父元素和子元素有HTML注释,会出问题. 下面我们使用通用选择器来模拟子选择器的效果. 原理:首先在所有后代上应用 ...
- 索引的重载 str["name"] str[i]
class Program { static void Main(string[] args) { IndexClass names = new IndexClass(); names[] = &qu ...
- win7下python3.4 ImportError: No module named 'MySQLdb'错误解决方法
首先,安装PyMySQL C:\Users\fnngj>python -m pip install PyMySQL 执行以下命令会报错: ImportError: No module named ...
- NMON中的各项参数指标
一.NMON中的各项参数指标: SYS_SUMM:显示当前服务器的总体性能情况 Total System I/OStatistics:Avg tps during an interval:显示采集间隔 ...
- bootstratp图标的使用
bootstratp作为一个优秀的前端框架,最近使用了其中的Glyphicon Halflings的字体图标.起初一直显示不出来,后面通过搜索相关资料直到成功显示,在此做一些总结,方便后面复习. 1. ...
- jQuery 操作复选框(checkbox) attr checked不起作用
参考资料 http://www.paobuke.com/develop/javascript/pbk849.html 这天用到jQuery功能,想实现一个简单的复选框动态全选或全不选,结果测试发现 ...
- Vs 控件错位 右侧资源管理器文件夹点击也不管用,显示异常
问题:显卡驱动异常. 缘由:驱动精灵万能显卡安装系统 解决方案:根据笔记本型号去官网下载适配显卡驱动.
- 【JAVA多线程概述】
一.多线程概述 一个进程中至少有一个线程,每一个线程都有自己运行的内容,这个内容可以称为线程要执行的任务. 不能没一个问题都使用多线程,能使用单线程解决的问题就不要使用多线程解决. 使用多线程的弊端: ...
- Spell checker
Spell checker Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Subm ...