题目链接:传送门
求出原数组的逆序对
算把一个数从对头拿到队尾的过程中
产生的贡献
诶我好像昨天做过这个题
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <complex>
#include <algorithm>
#include <climits>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define
#define
using namespace std;
typedef long long ll;
int n, m, t[A], a[A];
int lowbit(int x) {return x & -x;}
void change(int x, int val) {
for (int i = x; i <= n; i += lowbit(i)) t[i] += val;
}
int ask(int x, int ans = 0) {
for (int i = x; i > 0; i -= lowbit(i)) ans += t[i];
return ans;
}
int main(int argc, char const *argv[]) {
while (~scanf("%d", &n)) {
memset(t, 0, sizeof t);
int tot = 0, ans = 0;
for (int i = 1; i <= n; i++) {
cin >> a[i]; a[i]++;
tot += ask(n) - ask(a[i]);
change(a[i], 1);
}
ans = tot;
for (int i = 1; i <= n; i++) ans = min(ans, tot = tot - a[i] + n - a[i] + 1);
cout << ans << endl;
}
}