hdu_5775_Bubble Sort(树状数组)

时间:2021-05-14 21:35:33

题目链接:hdu_5775_Bubble Sort

题意:

让你找每一个数在冒泡排序中最右边和最左边的位置的差值

题解:

还是官方题解,讲的已经很清楚了

1012 Bubble Sort

考虑一个位置上的数字c在冒泡排序过程的变化情况。c会被其后面比c小的数字各交换一次,之后c就会只向前移动。数组从右向左扫,树状数组维护一下得到每个值右边有多少个比其小的值,加上原位置得到最右位置,最左位置为初始位置和最终位置的最小值。

时间复杂度O(n lg n)

 #include<bits/stdc++.h>
#define mst(a,b) memset(a,b,sizeof(a))
#define F(i,a,b) for(int i=a;i<=b;++i)
using namespace std; const int N=1e5+;
int ans[N],sum[N],n;
inline void add(int x,int c){while(x<=n)sum[x]+=c,x+=x&-x;}
inline int ask(int x){int an=;while(x)an+=sum[x],x-=x&-x;return an;} int main(){
int t,ic=,tp;
scanf("%d",&t);
while(t--)
{
mst(sum,);
scanf("%d",&n);
F(i,,n)
{
scanf("%d",&tp);
int mi=tp-ask(tp-)-;
add(tp,);
ans[tp]=i+mi-min(tp,i);
}
printf("Case #%d:",ic++);
F(i,,n)printf(" %d",ans[i]);puts("");
}
return ;
}