#include <cstdio>
#include <cassert>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<ll> st(8e5+5, 0);
void update(ll l, ll r, ll ind, ll pos){
if(l == r){st[ind]++; return;}
ll m = (l+r)/2;
if(pos<=m){
update(l, m, 2*ind, pos);
} else {
update(m+1, r, 2*ind+1, pos);
}
st[ind] = st[2*ind] + st[2*ind+1];
}
ll query(ll l, ll r, ll ind, ll ql, ll qr){
if(r<ql or qr<l){return 0;}
if(ql<=l and r<=qr){return st[ind];}
ll m = (l+r)/2;
return query(l, m, 2*ind, ql, qr) + query(m+1, r, 2*ind+1, ql, qr);
}
ll count_swaps(vector<int> s) {
ll inv = 0;
ll n = s.size();
n = n/2;
vector<ll> a, p(2*n);
vector<queue<ll>> q(4*n+1);
for(ll x : s){
if(x<0){
a.push_back(x);
a.push_back(-x);
}
}
//for(ll x : a){cout<<x<<" ";} cout<<endl;
for(ll i=0;i<2*n;i++){
q[2*n+a[i]].push(i);
}
for(ll i=0;i<2*n;i++){
//cout<<i<<": "<<q[s[i]+2*n].front()<<endl;
p[i] = q[s[i]+2*n].front();
q[s[i]+2*n].pop();
}
for(ll i=0;i<2*n;i++){
inv += query(0, 2*n-1, 1, p[i], 2*n-1);
update(0, 2*n-1, 1, p[i]);
}
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... |