逆序对的数量
下面展示一些
内联代码片
。
// A code block
逆序对的数量
归并思想
// An highlighted block
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e6 + 10;//注意数据范围
int a[N],t[N];
typedef long long LL;
LL guibing(int a[], int l, int r) {
if (l >= r)return 0;
int k = 0;LL res;
int mid = l + r >> 1;
int i = l; int y = 0;
int j = mid+1;
res=guibing(a, l, mid)+guibing(a, mid + 1, r);
while (i <= mid && j <= r){
if (a[i] <= a[j])
{
t[k++] = a[i++];
}
else { t[k++] = a[j++];
res += mid - i + 1;
}
}
while (i <= mid)t[k++] = a[i++];
while (j <= r)t[k++] = a[j++];
for ( i = l, j = 0; i <= r; i++,j++)a[i] = t[j];
return res;
}
int main() {
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
LL y=guibing(a, 0, n - 1);
printf("%lld", y);
return 0;
}
为什么归并里面判断两边的大小时
必须要写成q[i]<=q[j],而不能写成q[i]<q[j]呢?
而快排里面,分别比较两边和中间值的大小时
必须写成q[i]<x ,q[j]>x,而不能写成q[i]<=x,q[j]>=x呢?
归并中如果q[i] == q[j]则 i 和 j 不构成逆序对,所以只归并,不计算逆序对。
快排里如果q[i] <= x则如果有一段连续相同的数会让i指针移动到底,从而导致下一层区间和这一层区间是一样的,造成死循环。