#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i, l, r) for(int i = l; i <= r; i++)
#define FORD(i, l, r) for(int i = l; i >= r; i--)
#define all(x) (x).begin(), (x).end()
#define pb push_back
struct BIT{
int n;
vector<int> bit;
BIT(int __n = 0){
init(__n);
}
void init(int __n = 0){
n = __n;
bit.assign(n + 5, 0);
}
void update(int i, int v){
++i;
while(i <= n){
bit[i] += v;
i += i &-i;
}
}
int query(int i){
++i;
int ans = 0;
while(i > 0){
ans += bit[i];
i -= i &-i;
}
return ans;
}
int query(int l, int r){
return query(r) - query(l - 1);
}
};
ll count_swaps(vector<int> a){
int n = a.size();
int maxi = 0;
FOR(i, 0, n - 1) maxi = max(maxi, abs(a[i]));
BIT bit(n + 1);
vector<deque<int>> L(maxi + 1), R(maxi + 1);
FOR(i, 0, n - 1){
int x = abs(a[i]);
if(x != a[i]) L[x].pb(i);
else R[x].pb(i);
}
//FOR(i, 0, n - 1) cout << i << ": " << match[i] << " ";
ll ans = 0;
FOR(i, 0, n - 1) bit.update(i, 1);
vector<bool> used(n, false);
FOR(i, 0, n - 1){
if(used[i]) continue;
int x = abs(a[i]);
int j;
if(x != a[i]){
L[x].pop_front();
j = R[x].front();
R[x].pop_front();
ans += bit.query(i + 1, j - 1);
}
else{
++ans;
R[x].pop_front();
j = L[x].front();
L[x].pop_front();
ans += bit.query(i + 1, j - 1);
}
used[i] = used[j] = true;
bit.update(i, -1);
bit.update(j, -1);
}
return ans;
}
| # | 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... |