SGU 180.Inversions

没什么好说的离散化求逆序对,树状数组即可

 

code

#include <iostream>

#include <algorithm>

#define INF 66666

using namespace std;

int A[INF], g[INF], pos[INF], n;

long long ans;

void update (int x, int k) {

	for (; x <= n; x += x & -x)  A[x] += k;

}

long long getsum (int x) {

	long long  sum = 0;

	for (; x > 0; x -= -x & x)   sum += A[x];

	return sum;

}

bool cmp (int a, int b) {

	return g[a] < g[b];

}

int  main() {

	cin >> n;

	for (int i = 1; i <= n; i++) cin >> g[i], pos[i] = i;

	stable_sort (pos + 1, pos + 1 + n, cmp);

	for (int i = 1; i <= n; i++) g[pos[i]] = i;

	for (int i = n; i >= 1; i--) {

		update (g[i], 1);

		ans += getsum (g[i] - 1);

	}

	cout << ans << endl;

}

  

你可能感兴趣的:(version)