#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int maxn = 5e4+7;
int arr[maxn];
int merge(int l, int r){
if(l >= r) return 0;
int mid = l + r >> 1; //移位优先级比加减低
int res = merge(l, mid) + merge(mid+1, r);
int i = l, j = mid + 1;
vector<int> temp;
while(i <= mid && j <= r){
if(arr[i] <= arr[j]) temp.push_back(arr[i++]);
else{
res += mid - i + 1;
temp.push_back(arr[j++]);
}
}
while(i <= mid) temp.push_back(arr[i++]);
while(j <= r) temp.push_back(arr[j++]);
i = l;
for(auto x: temp) arr[i++] = x;
return res;
}
int main(){
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> arr[i];
}
cout<<merge(0, n - 1)<<endl;
return 0;
}
51nod 1019 逆序数
最新推荐文章于 2022-02-11 11:43:21 发布