hdu Data Structure? 线段树

来源:互联网 发布:淘宝摩托车准备店铺 编辑:程序博客网 时间:2024/05/21 06:30

线段树维护该区间有多少个数就好,计算名次时二分一下。

#include <stdio.h>#define maxn 362144 int tree[4*maxn];void pushup(int o){    tree[o]=tree[o*2]+tree[o*2+1];}void build(int l,int r,int o){    if(l==r)    {        tree[o]=1;        return ;    }    int m=(l+r)/2;    build(l,m,o*2);    build(m+1,r,o*2+1);    pushup(o);}int query(int p,int l,int r,int o){    if(l==r)    {        tree[o]=0;        return l;    }    int ans;    int m=(l+r)/2;    if(tree[o*2]>=p) ans=query(p,l,m,2*o);    else ans=query(p-tree[o*2],m+1,r,2*o+1);    pushup(o);    return ans;}int main(){    int t;    int n,k;    int i,x;    int cas=0;    scanf("%d",&t);    while(t--)    {        cas++;        scanf("%d%d",&n,&k);        build(1,n,1);        __int64 tot=0;        for(i=1;i<=k;i++)        {            scanf("%d",&x);            tot+=query(x,1,n,1);        }        printf("Case %d: %I64d\n",cas,tot);    }    return 0;}


 

0 0