#include "shoes.h"
#include <bits/stdc++.h>
#define maxn 100005
using namespace std;
int n, m;
int tmp[maxn];
set<int> O[maxn], C[maxn], R;
int a[2*maxn], bit[2*maxn];
void upd(int u, int d) {
for (int i = u; i > 0; i -= i & -i) bit[i] += d;
}
int get(int u) {
int kq = 0;
for (int i = u; i <= n+n; i += i & -i) kq += bit[i];
return kq;
}
long long count_swaps(vector<int> s) {
n = s.size()/2;
for (int i = 0, id = 0; i < s.size(); i++)
if (s[i] > 0) tmp[++id] = s[i];
sort(tmp + 1, tmp + n + 1);
m = unique(tmp + 1, tmp + n + 1) - tmp - 1;
for (int i = 0; i < s.size(); i++) {
int mult = (s[i] > 0 ? 1 : -1);
s[i] = mult * (lower_bound(tmp + 1, tmp + m + 1, s[i]*mult) - tmp);
}
for (int i = 0; i < s.size(); i++) {
R.insert(i);
if (s[i] < 0) O[-s[i]].insert(i);
else C[s[i]].insert(i);
}
for (int i = 1; i <= 2*n; i += 2) {
int H = *R.begin(); R.erase(R.begin());
int spr = s[H];
if (spr < 0) {
a[H] = i;
a[*C[-spr].begin()] = i+1;
R.erase(*C[-spr].begin());
O[-spr].erase(O[-spr].begin());
C[-spr].erase(C[-spr].begin());
} else {
a[H] = i+1;
a[*O[spr].begin()] = i;
R.erase(*O[spr].begin());
O[spr].erase(O[spr].begin());
C[spr].erase(C[spr].begin());
}
}
int64_t inv = 0;
for (int i = 0; i < 2*n; i++) {
inv += get(a[i]+1);
upd(a[i], 1);
}
return inv;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |