逆序数 - k 为结果。逆序数可用离散化加树状数组求得。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <stack>
#include <bitset>
#define INF (int)(1e9)
#define maxn 100010
#define Lson l, mid, rt << 1
#define Rson mid + 1, r, rt << 1 | 1
using namespace std;
typedef long long ll;
int a[maxn][2], ix[maxn], sum[maxn << 1];
bool cmp (int _a, int _b) {
return a[_a][0] < a[_b][0];
}
int lowbit(int x) {
return x&(-x);
}
void update(int x, int v) {
for (; x <= maxn; x += lowbit(x)) {
sum[x] += v;
}
}
int query(int x) {
int ret = 0;
for (; x > 0; x -= lowbit(x)) {
ret += sum[x];
}
return ret;
}
int main() {
int n, k;
while (scanf("%d%d", &n, &k) != EOF) {
memset(sum, 0, sizeof(sum));
for (int i = 0; i < n; ++ i) {
scanf("%d", &a[i][0]);
ix[i] = i;
}
sort(ix, ix+n, cmp);
int p = 1;
a[ix[0]][1] = p;
for (int i = 1; i < n; ++ i) {
if (a[ix[i]][0] == a[ix[i-1]][0]) {
a[ix[i]][1] = p;
}
else {
++ p;
a[ix[i]][1] = p;
}
}
ll cnt = 0;
for (int i = 0; i < n; ++ i) {
update(a[i][1], 1);
cnt += (i+1-query(a[i][1]));
}
printf("%I64d\n", max(cnt-k,0ll));
}
}