您的位置:首页 > 其它

zoj 3635 树状数组加二分

2012-08-26 23:42 295 查看
以前这种没写过,今天写了一下,当模板用了



#include<stdio.h>
#include<string.h>
#define maxn 50010
int a[maxn];
int b[maxn];
int n; 
int lowbit(int x)
{
    return x&(-x);
}
int sum(int end)
{
    int sum=0;
    while(end>0)
    {
       sum+=a[end];
       end-=lowbit(end);
    }
    return sum;
}
void add(int pos,int num)
{
     while(pos<=n)
     {
       a[pos]+=num;
       pos+=lowbit(pos);
     }
}
int main()
{
    while(scanf("%d",&n)==1)
    {
       memset(a,0,sizeof(a));
       int i,j,x;
       for(i=1;i<=n;i++)
       add(i,1);
       for(i=1;i<=n;i++)
       {
          scanf("%d",&x);
          int l=1,r=n;
          while(l<=r)
          {
            int mid=(l+r)/2;
            if(sum(mid)>=x)
            r=mid-1;
            else
            l=mid+1;
          }
          b[i]=l;
          add(l,-1);
       }
       int m;
       scanf("%d",&m);
       while(m--)
       {
          scanf("%d",&x);
          if(m)
          printf("%d ",b[x]);
          else 
          printf("%d",b[x]);
       }
       printf("\n");
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: