zoj 3635 树状数组加二分

来源:互联网 发布:知乎指数 编辑:程序博客网 时间:2024/06/10 04:19

 

以前这种没写过,今天写了一下,当模板用了

 

#include<stdio.h>#include<string.h>#define maxn 50010int 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;}