程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> hdu2852 KiKi's K-Number 樹狀數組求第k大數

hdu2852 KiKi's K-Number 樹狀數組求第k大數

編輯:C++入門知識

hdu2852 KiKi's K-Number 樹狀數組求第k大數


//再求第k大數時只需要getsum(b-1) //b就是a的第k大數
//又gesum(b-1)<=getsum(b)則可以用二分查找來做
#include
#include
#include
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 {
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 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);
}
}
}
}











































































































  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved