6051: KiKi's K-Number (树状数组)

Posted ydw--

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6051: KiKi's K-Number (树状数组)相关的知识,希望对你有一定的参考价值。

增加一个数就update(x,1)

减去这个数就update(x,-1)

查看是否有某个数就query(x)-query(x-1)是否>0

看比a大k的数就二分查找query值为query(a)+k的数

 

http://www.tzcoder.cn/acmhome/problemdetail.do?&method=showdetail&id=6051

技术图片
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
int c[100005],a[100005];
int lowbit(int x)
{
    return x&-x;
}
int updata(int x,int y)
{
    while(x<=maxn){
        c[x]+=y;
        x+=lowbit(x);
    }
}
int query(int x)
{
    int sum=0;
    while(x){
        sum+=c[x];
        x-=lowbit(x);
    }
    return sum;
}
int main(){
    int n;
    while(~scanf("%d",&n)){
       memset(c,0,sizeof(c));
       while(n--){
            int p;
            scanf("%d",&p);
            if(p==0){
                int e;
                scanf("%d",&e);
                updata(e,1);
            }
            else if(p==1){
                int e;
                scanf("%d",&e);
                if(query(e)-query(e-1)==0)printf("No Element!
");
                else updata(e,-1);
            }
            else {
                int a,k;
                scanf("%d%d",&a,&k);
                if(query(maxn)-query(a)<k)printf("Not Find!
");
                else{
                    int answer=query(a)+k;
                    int l=0,r=maxn,mid;
                    while(l<=r){
                        mid=(l+r)/2;
                        if(query(mid)<answer)l=mid+1;
                        else r=mid-1;
                    }
                    printf("%d
",l);
                }
            }
       }
    }
    return 0;
}
View Code

 

以上是关于6051: KiKi's K-Number (树状数组)的主要内容,如果未能解决你的问题,请参考以下文章

hdu2852 KiKi&#39;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(树状数组+二分)

HDU 2852 KiKi's K-Number (树状数组 && 二分)