您的位置:首页 > 其它

Uva-11525-Permutation

2013-04-24 20:37 288 查看
其中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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: