分析:按照官方提示,在归并排序的过程中统计。
注意:(1)结果可能很大,用long long;(2)第二行输入数据从左到右等级依次递增。
代码如下:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
ll mergeSortCnt(vector<int>& nums,vector<int>::iterator bg,vector<int>::iterator ed){
if(ed-bg<=1)
return 0;
auto mid=bg+(ed-bg)/2;
ll cnt=mergeSortCnt(nums,bg,mid)+mergeSortCnt(nums,mid,ed);
auto it_j=mid;
for(auto it=bg;it!=mid;++it){
while(it_j!=ed && *it_j>*it){
++it_j;
}
cnt+=(it_j-mid);
}
inplace_merge(bg,mid,ed,greater<int>());
return cnt;
}
int main() {
int n;
cin>>n;
vector<int> nums(n);
for(int i=1;i<=n;++i)
cin>>nums[n-i];
cout<<mergeSortCnt(nums,nums.begin(),nums.end())<<endl;
return 0;
}