HDU 5775 Bubble Sort

对于一个数,可以记录3个位置:初始位置,终点位置,最右边的位置。

初始位置和终点位置容易计算。最多边的位置即为初始状态下该数的位置+该数之后还有多少数比该数小。

三个位置中的min即为leftpos,max即为rightpos

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-8;
void File()
{
    freopen("D:\\in.txt","r",stdin);
    freopen("D:\\out.txt","w",stdout);
}
inline int read()
{
    char c = getchar();  while(!isdigit(c)) c = getchar();
    int x = 0;
    while(isdigit(c)) { x = x * 10 + c - '0'; c = getchar(); }
    return x;
}

const int maxn=100000+10;
int n,a[maxn],c[maxn],p[maxn],L[maxn],R[maxn];

int lowbit(int x) { return x&(-x); }
void update(int x) { while(x<=n) c[x]+=1,x+=lowbit(x); }
int get(int x) {int res=0; while(x) res=res+c[x],x-=lowbit(x); return res;}

int main()
{
    int T; scanf("%d",&T); int cas=1;
    while(T--)
    {
        scanf("%d",&n); memset(c,0,sizeof c);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]),L[a[i]]=min(i,a[i]),R[a[i]]=max(i,a[i]);
        for(int i=1;i<=n;i++)
        {
            int x=get(a[i]-1); x=a[i]-1-x; update(a[i]);
            L[a[i]]=min(L[a[i]],i+x), R[a[i]]=max(R[a[i]],i+x);
        }

        printf("Case #%d:",cas++);
        for(int i=1;i<=n;i++) printf(" %d",abs(L[i]-R[i]));
        printf("\n");
    }
    return 0;
}

 

posted @ 2016-07-30 15:21  Fighting_Heart  阅读(141)  评论(0编辑  收藏  举报