hdu2852 KiKi's K-Number 树状数组求第k大数
来源:互联网 发布:snmp网络拓扑发现 编辑:程序博客网 时间:2024/06/10 08:13
//再求第k大数时只需要getsum(b-1)<getsum(a)+k<=getsum(b)
//b就是a的第k大数
//又gesum(b-1)<=getsum(b)则可以用二分查找来做
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100010;
int tree[maxn];
int lowbit(int i)
{
return (i&(-i));
}
int getsum(int i)
{
int sum=0;
while(i>0)
{
sum+=tree[i];
i-=lowbit(i);
}
return sum;
}
void update(int i,int dx)
{
while(i<maxn)
{
tree[i]+=dx;
i+=lowbit(i);
}
}
void find(int left,int right,int num)
{
while(left<=right)
{
//int middle=(left+right)/2;
int middle = left + (right - left) / 2;
int tmp=getsum(middle);
if(tmp<num)
left=middle+1;
else
right=middle-1;
}
if(left>=maxn)
printf("Not Find!\n");
else
printf("%d\n",left);
}
int main()
{
//freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int m;
while(scanf("%d",&m)!=EOF)
{
int p,a,k;
memset(tree,0,sizeof(tree));
while(m--)
{
scanf("%d",&p);
if(p==0)
{
scanf("%d",&a);
update(a,1);
}
else if(p==1)
{
scanf("%d",&a);
if(!(getsum(a)-getsum(a-1)))
{
printf("No Elment!\n");
continue;
}
else
update(a,-1);
}
else
{
scanf("%d%d",&a,&k);
int tmp=getsum(a);
find(a+1,maxn-1,tmp+k);
}
}
}
}
//b就是a的第k大数
//又gesum(b-1)<=getsum(b)则可以用二分查找来做
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=100010;
int tree[maxn];
int lowbit(int i)
{
return (i&(-i));
}
int getsum(int i)
{
int sum=0;
while(i>0)
{
sum+=tree[i];
i-=lowbit(i);
}
return sum;
}
void update(int i,int dx)
{
while(i<maxn)
{
tree[i]+=dx;
i+=lowbit(i);
}
}
void find(int left,int right,int num)
{
while(left<=right)
{
//int middle=(left+right)/2;
int middle = left + (right - left) / 2;
int tmp=getsum(middle);
if(tmp<num)
left=middle+1;
else
right=middle-1;
}
if(left>=maxn)
printf("Not Find!\n");
else
printf("%d\n",left);
}
int main()
{
//freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
int m;
while(scanf("%d",&m)!=EOF)
{
int p,a,k;
memset(tree,0,sizeof(tree));
while(m--)
{
scanf("%d",&p);
if(p==0)
{
scanf("%d",&a);
update(a,1);
}
else if(p==1)
{
scanf("%d",&a);
if(!(getsum(a)-getsum(a-1)))
{
printf("No Elment!\n");
continue;
}
else
update(a,-1);
}
else
{
scanf("%d%d",&a,&k);
int tmp=getsum(a);
find(a+1,maxn-1,tmp+k);
}
}
}
}
0 0
- hdu2852 KiKi's K-Number 树状数组求第k大数
- 树状数组求第K小值 (spoj227 Ordering the Soldiers && hdu2852 KiKi's K-Number)
- HDU2852 KiKi's K-Number 树状数组+二分
- HDU2852 KiKi's K-Number(二分+树状数组)
- hdu2852 KiKi's K-Number
- hdu2852 KiKi's K-Number
- HDU2852-KiKi's K-Number
- hdu2852--KiKi's K-Number(线段树,求第k个数)
- HDU2852-KiKi's K-Number(树状数组+二分|权值线段树)
- hdu2852——KiKi's K-Number
- hdu2852 KiKi's K-Number 线段树
- HDU2852 KiKi's K-Number (线段树求数列K大)
- HDU 2852——KiKi's K-Number(树状数组+二分查找, 第k大)
- HDU2852 KiKi's K-Number 线段树单点更新
- HDU2852 KiKi's K-Number (主席树)
- hdu 2852 KiKi's K-Number 二分+树状数组
- HDU 2852 KiKi's K-Number 树状数组
- [树状数组]hdu 2852 KiKi's K-Number# +二分查找。
- Android常用的五大布局:LinearLayout/RelativeLayout/AbsoluteLayout/ TableLayout/FrameLayout
- 【连通图|边双连通分量+Tarjan+并查集】POJ-3694 Network(400+ms)
- HDFS新特性Centralized Cache Management介绍
- mysql定时备份脚本
- Android EGL_BAD_CONFIG error,配置EGLConfigChooser
- hdu2852 KiKi's K-Number 树状数组求第k大数
- windows下使用libxml2处理XML报文
- Hadoop 1.2.1升级2.6.0的一次崎岖之旅(包括Hive、HBase对应的升级)
- 蓝桥杯——安慰奶牛
- 通过不同的域名来访问根目录和根目录下的子目录
- hiho一下 第十五周
- 物联12:rfid与IC卡
- minicom配置及使用方法
- TCON控制字及TMOD寄存器