HDU5592 ZYB's Premutation 樹狀數組應用

#include<iostream>
#include<stdio.h>
#include<string>
#include<algorithm>
using namespace std;
int a[50005];//已知數組;
int c[50005];//樹狀數組;
int n;

 int lowBit(int x)  //計算2^K的值,即下標爲X的結點管轄的範圍 
    {  
        return x&(-x);  
    }  

     void modify(int pos,int num)  //pos爲數組下標位置,num爲要增加的值   
    {  
        while(pos<=n)   //n爲數組的長度   
        {  
            c[pos]+=num;  
            pos+=lowBit(pos);  
        }  
    }  

      int getResult(int pos)  //求A[1]+...+A[pos]   
    {  
        int sum=0;   
        while(pos>0)  
        {  
            sum+=c[pos];  
            pos-=lowBit(pos);  //下一個無聯繫的轄域 
        }  

        return sum;   
    }       
    int findkth(int n,int k){
        if(k-c[n]<=0){
                int i=n;
                if(k-a[i]==0){
                    a[i]=0;
                modify(i,-1);
                return i;
                }
                else {
                    findkth(n-1,k-a[i]);

                }
        } 
        else findkth(n-lowBit(n),k-c[n]);
    }//尋找第k大的數的位置 

void f()
{
    int t[50005];

    int i;
    int b1=0,b2=0;

    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        a[i]=1;
        modify(i,1);
        scanf("%d",&b2);
        t[i]=b2-b1;
        b1=b2;
    }
    for(i=n;i>0;i--)
    {
        t[i]=findkth(n,t[i]+1);//在i個數裏尋找第t[i]+1大的數
    }
   for(i=1;i<n;i++)
   printf("%d ",t[i]);
   printf("%d\n",t[n]);
}

int main(){

    int T;
    cin>>T;
    while(T){
        f();
        T--;
    }
    return 0;
} 

已經忘記題意了~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章