#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()
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 = *max_element(all(a));
BIT bit(n + 1);
vector<int> pos(n + 1, 0), match(n + 1, -1), last(maxi + 1, -1);
FOR(i, 0, n - 1){
int x = abs(a[i]);
if(last[x] == -1) last[x] = i;
else{
match[i] = last[x];
match[last[x]] = 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 j = match[i];
if(i > j) continue;
ans += bit.query(i + 1, j - 1);
bit.update(i, -1);
bit.update(j, -1);
if(a[i] > 0) ++ans;
used[i] = used[j] = true;
}
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... |