poj_2299 Ultra-QuickSort (逆序對)
阿新 • • 發佈:2018-12-12
分析:這個題就是典型的求逆序對個數問題,注意題目中的要求,只能交換相鄰兩個元素的值,而逆序對巨集觀上就是把所有的項按從小到大排序後的次數。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int maxn=5e5+5; long long a[maxn]; long long b[maxn]; long long cnt=0; void Merge(long long l,long long mid,long long r) { long long i=l,j=mid+1; for(long long k=l;k<=r;k++) { if(j>r||(i<=mid&&a[i]<a[j]))b[k]=a[i++]; else b[k]=a[j++],cnt+=mid-i+1; } for(long long k=l;k<=r;k++) a[k]=b[k]; } void solve(long long l,long long r) { if(l<r) { int mid=(l+r)>>1; solve(l,mid); solve(mid+1,r); Merge(l,mid,r); } } int main() { int n; while(scanf("%d",&n)&&n) { cnt=0; for(int i=0;i<n;i++) scanf("%lld",&a[i]); solve(0,n-1); printf("%lld\n",cnt); } return 0; }