当前位置: 代码迷 >> 综合 >> HDOJ 5775 (2016多校联合训练 Training Contest 4) Bubble Sort
  详细解决方案

HDOJ 5775 (2016多校联合训练 Training Contest 4) Bubble Sort

热度:47   发布时间:2023-12-06 03:15:25.0

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5775


题意:让我们求出每一个数在冒泡排序中的排在最左边的位置和最右边的位置的差。

冒泡排序,仔细思考一下其中的原理,每一次我们都是从右边开始在前面前后交换,也就是说每一个数如果左边有几个数比它小,那么在它开始移动的时候,就要向右边移动多少次,所以能够排在最右边的位置就是它的当前位置+右边比它小的数的个数,而能够排在最左边的位置显然就是它的当前位置或者最终状态。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 100000+10;
int a[maxn], c[maxn], L[maxn], R[maxn], n;
int Lowbit(int x)
{return x&(-x);
}
void update(int x, int detal)
{while(x <= n){c[x] += detal;x += Lowbit(x);}
}
int getsum(int x)
{int sum = 0;while(x){sum += c[x];x -= Lowbit(x);}return sum;
}
int main()
{int T, t=1;scanf("%d", &T);while(T--){scanf("%d", &n);for(int i=1; i<=n; i++){c[i] = 0;scanf("%d", &a[i]);L[a[i]] = min(i, a[i]);}for(int i=n; i>0; i--){R[a[i]] = i + getsum(a[i]);update(a[i], 1);}printf("Case #%d:", t++);for(int i=1; i<=n; i++){//printf("%d %d", R[i], L[i]);printf(" %d", R[i] - L[i]);}printf("\n");}
}


  相关解决方案