#include <bits/stdc++.h>
using namespace std;
struct BIT {
int n;
vector<int> t;
BIT(int _n):n(_n),t(n+1,0){}
void add(int i,int v){ for(;i<=n;i+=i&-i) t[i]+=v; }
int sum(int i){ int r=0; for(;i>0;i-=i&-i) r+=t[i]; return r;}
};
long long count_swaps(vector<int> S) {
// vector of occurences for each type
int N = S.size();
vector<pair<int, int> > occ[N / 2 + 1];
for (int i = 0; i < N; i++) {
occ[abs(S[i])].push_back({S[i], i});
}
long long ans = 0;
vector<pair<int, int> > intervals;
for (int x = 1; x <= N / 2; x++) {
vector<pair<int, int> > &v = occ[x];
int m = v.size() / 2;
sort(v.begin(), v.end());
for (int i = 0; i < m; i++) {
int l = v[i].second;
int r = v[i + m].second;
if (l > r) {
swap(l, r);
ans++;
}
intervals.push_back({l + 1, r + 1});
}
}
sort(intervals.begin(), intervals.end());
BIT bit(N);
for (int i = 1; i <= N; i++)
bit.add(i, 1);
for (int i = 1; i <= N; i++) {
int l = intervals[i].first;
int r = intervals[i].second;
bit.add(i, 1);
ans += bit.sum(r - 1) - bit.sum(l);
bit.add(l, -1);
bit.add(r, -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... |