题意:给定一个正整数n,和一个1-n的一个排列,每个数可以和旁边的两个数的任意一个交换,每交换一次总次数就要加一,问将这个排列转换成一个递增的排列需要多少次交换?
题意可以转换成求这个排列的逆序对数。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int M=1e3+3; int bit[M],n; void update(int x,int c){ while(x<=n) bit[x]+=c,x+=x&-x; } int sum(int x){ int ans=0; while(x) ans+=bit[x],x-=x&-x; return ans; } int main(){ while(~scanf("%d",&n)){ int ans=0; memset(bit,0,sizeof(bit)); for(int i=1;i<=n;i++){ int x; scanf("%d",&x); update(x,1); ans+=i-sum(x);//sum(x)表示小于等于x的总数,而i-sum()则表示大于x的总数,即为逆序数的总数 } printf("%d\n",ans); } return 0; }
原文:https://www.cnblogs.com/starve/p/11182274.html