树状数组-杭电-5592

来源:互联网 发布:mysql中timestampdiff 编辑:程序博客网 时间:2024/06/06 05:44
using namespace std;int num[MAX];int ans[MAX];int n;int lowbit (int a){   return a&(-a);}void update (int x,int date){   while (x<=n)   {      num[x]+=date;      x+=lowbit(x);   }}int make_sum(int x){   int as=0;   while (x>0)   {      as+=num[x];      x-=lowbit(x);   }   return as;}int make_who(int x)//找出第k大的位置{   if (make_sum(n)<x) return -1;   int l,r,mid;   l=1; r=n;   mid=(int)((l+r)/2);   while (r>l)   {      if (make_sum(mid)<x) l=mid+1;      else r=mid;      mid=(int)((l+r)/2);   }   return l;}int main(){   int i,j,k;   int t,te;   int c[MAX];   scanf ("%d",&t);   while (t--)   {      memset(num,0,sizeof(num));      memset(ans,0,sizeof(ans));      memset(c,0,sizeof(c));      scanf ("%d",&n);      for (i=1; i<=n; i++)      {         scanf ("%d",&c[i]);         update(i,1);      }      te=0;      for (i=n; i>0; i--)      {         int ca;         ca=c[i]-c[i-1];         ans[i]=make_who(n-te-ca);         update(ans[i],-1);         te++;      }      for (i=1; i<=n; i++)      {         if (i==1) printf("%d",ans[i]);         else printf(" %d",ans[i]);      }      printf("\n");   }   return 0;}

0 0
原创粉丝点击