标签:位置 ons printf turn 逆序 cstring 基础 main space
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。如2 4 3 1中,2 1,4 3,4 1,3 1是逆序,逆序数是4。给出一个整数序列,求该序列的逆序数。
-----------------------------------------------------------------------------
二分排序的思想,合并两个有序数列a,b时,如果序列b队首元素小则逆序数增加序列a的当前长度。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 50500; int A[2][N]; int main(){ long long ans = 0; int n;cin>>n; for(int i=0;i<n;i++) scanf("%d",A[0]+i); bool flag = false; int aid,bid,cid; for(int stride = 1;stride<n;stride<<=1){ for(int i=0;i<n;i+=(stride<<1u)){ bid = (cid = aid = i) + stride; int aed = std::min(bid,n); int bed = std::min(bid+stride,n); while(aid<aed&&bid<bed){ if(A[flag][aid]<=A[flag][bid]){ A[!flag][cid++] = A[flag][aid++]; } else{ A[!flag][cid++] = A[flag][bid++]; ans+=aed-aid; } } while(aid<aed) A[!flag][cid++] = A[flag][aid++]; while(bid<bed) A[!flag][cid++] = A[flag][bid++]; } flag = !flag; } printf("%lld\n",ans); return 0; }
标签:位置 ons printf turn 逆序 cstring 基础 main space
原文地址:http://www.cnblogs.com/redips-l/p/7994006.html