G - Ultra-QuickSort (POJ - 2299)
- 题目大意
给出一串数字,求是它为顺序排列的最小的交换次数。(求逆序数)
- 解题思路
利用树状数组来解决,每输入一个数,就跟前面的数比较有没有比它大的,有就记录,然后添加该点。
- 代码
#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<cstring> #include<stack> using namespace std; int n; const int N=1e6+1; char str[10]; int num[N]; int lowbit(int x) { return x&(-x); } long long sum(int x) { long long re=0; for(int i=x;i>0;i-=lowbit(i)) re+=num[i]; return re; } void add(int x) { for(int i=x;i<N;i+=lowbit(i)) num[i]++; } int main() { int m; while(scanf("%d",&n)) { if(n==0) break; memset(num,0,sizeof(num)); long long cnt=0; for(int i=0;i<n;i++) { scanf("%d",&m); cnt+=i-sum(m+1); add(m+1); } printf("%lld\n",cnt); } return 0; }