#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int l[100005],s[100005],a[100005];
template <typename T> void Merge( T* arr, int low, int mid, int high )
{
int i, j, k;
i = low;
j = mid + 1;
k = 0;
T* tmp = new T[high - low + 1];
while( i <= mid && j <= high )
{
if ( *(arr + i) < *(arr + j) )
*(tmp + k++) = *(arr + i++);
else
{
l[arr[j]]+=mid-i+1;
*(tmp + k++) = *(arr + j++);}
}
while( i <= mid )
*(tmp + k++) = *(arr + i++);
while( j <= high )
*(tmp + k++) = *(arr + j++);
for( i=low, k=0; i<=high; i++, k++ )
{
*(arr + i) = *(tmp + k);
}
delete [] tmp;
}
template <typename T> void MergeSort( T* arr, int low, int high )
{
int mid;
if ( low == high )
return;
else
{
mid = ( low + high ) / 2;
MergeSort( arr, low, mid );
MergeSort( arr, mid+1, high );
Merge( arr, low, mid, high );
}
}
int main()
{
int t,cnt=1,n,i;
scanf("%d",&t);
while(t--&&scanf("%d",&n)!=EOF)
{
memset(l,0,sizeof(l));
for(i=1;i<=n;i++)
{
scanf("%d",a+i);
s[a[i]]=i;
}
MergeSort(a,1,n);
printf("Case #%d: ",cnt++);
for(i=1;i<=n-1;i++)
{
printf("%d ",max(s[i],i+l[i])-min(s[i],i));
}
printf("%d\n",max(s[n],n+l[n])-min(s[n],n));
}
return 0;
}
hdu 5775 2016 Multi-University Training Contest 4(归并排序)
最新推荐文章于 2017-12-07 01:01:13 发布