ybt1311 求逆序对
时空限制 1000ms/64MB
题目描述
给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目。
输入
第一行为n,表示序列长度,接下来的n行,第i+1i行表示序列中的第i个数。
输出
所有逆序对总数。
输入样例
4 3 2 3 2
输出样例
3
说明
n≤10^5,ai≤10^5。
代码
#include<iostream> //O(nlogn) 稳定
using namespace std;
const int N = 100005;
int n,a[N],b[N];
long long ans=0;
void mergesort(int L,int R){
if (L>=R) return;
int mid=(L+R)/2;
mergesort(L,mid);
mergesort(mid+1,R);
int i=L,j=mid+1,k=L;
while (i<=mid && j<=R)
if (a[i]<=a[j]) b[k++]=a[i++]; //递增排序
else b[k++]=a[j++],ans+=mid-i+1; //前面小后面大
while (i<=mid) b[k++]=a[i++];
while (j<=R) b[k++]=a[j++];
for (i=L; i<=R; ++i) a[i]=b[i];
}
int main(){
ios::sync_with_stdio(false);
cin>>n;
for (int i=1; i<=n; ++i) cin>>a[i];
mergesort(1,n);
cout<<ans<<endl;
return 0;
}
本文介绍了一种基于归并排序的逆序对求解算法,该算法的时间复杂度为O(nlogn),适用于大规模数据集。通过递归地将序列分成两半,并对每半进行排序和合并来计算逆序对的数量。

912

被折叠的 条评论
为什么被折叠?



