30pts球跳玄1关
  • 板块P1908 逆序对
  • 楼主imsbNR
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/9/17 15:23
  • 上次更新2024/9/17 18:25:50
查看原帖
30pts球跳玄1关
1198462
imsbNR楼主2024/9/17 15:23
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 5e5 + 5;
ll n, a[N], c[N], cnt;
void merge(ll l, ll mid, ll r)
{
	ll i = l, j = mid + 1, k = 0;
	for (; i <= mid and j <= r;)
	{
		if (a[i] < a[j])
			c[++k] = a[i++];
		else
			c[++k] = a[j++], cnt += mid - i + 1;
	}
	while (i <= mid)
		c[++k] = a[i++];
	while (j <= r)
		c[++k] = a[j++];
	for (int i = l, j = 1; i <= r; i++, j++)
		a[i] = c[j];
	return;
}
void msort(ll l, ll r)
{
	if (l == r)
		return;
	ll mid = (l + r) >> 1;
	msort(l, mid);
	msort(mid + 1, r);
	merge(l, mid, r);
}
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	msort(1, n);
	cout << cnt << '\n';
	return 0;
}
2024/9/17 15:23
加载中...