Uva-11525-Permutation

来源:互联网 发布:泰牛程序员吧 编辑:程序博客网 时间:2024/05/19 02:24

其中Si的含义应该为最后结果中,第i个数的逆序数个数,所以用线段树就可以直接得出。

线段树中所存的信息为L,R区间中存在合法的数的个数,在查询过程中不断的更新,最终便能够找到我们所需要的值。


代码:

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn=10e4+10;int n,t[maxn*3];void Built(int L,int R,int index){    t[index]=R-L+1;    if(L==R)return;    int mid=(L+R)>>1;    Built(L,mid,index<<1);    Built(mid+1,R,index<<1|1);}int Search(int num,int L,int R,int index){    t[index]--;    if(L==R)return L;    int mid=(L+R)>>1;    if(num<=t[index<<1])return Search(num,L,mid,index<<1);    return Search(num-t[index<<1],mid+1,R,index<<1|1);}int main(){    int T;    scanf("%d",&T);    while(T--)    {scanf("%d",&n);Built(1,n,1);for(int i=0;i<n;i++){    int ita;    scanf("%d",&ita);    printf("%d%c",Search(ita+1,1,n,1),i==n-1?'\n':' ');}    }    return 0;}


原创粉丝点击