一個智障的求逆序對的問題

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string.h>
#define ll long long 
using namespace std;

const int N = 5010;
int bit[N];
int n;
void add(int i)
{
	while (i <= n) {
		bit[i] += 1;
		i += (i&-i);
	}
}

int sum(int i)
{
	int s = 0;
	while (i>0)
	{
		s += bit[i];
		i -= (i&-i);
	}
	return s;
}
int main()
{
	while (cin>>n)
	{
		ll result = 0;
		int a[N];
		memset(bit, 0, sizeof(bit));
		for (int i = 1; i <= n; i++) {
			cin >> a[i],a[i]++;
			add(a[i]);
			result+= i - sum(a[i]);
		}
		ll ans = result;
		for (int i = 1; i <= n; i++) {
			result = result + n - 2 * a[i] + 1;
			ans = min(ans, result);
		}
		cout << ans << endl;
	}
	return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章