# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1215802 | gortomi | Arranging Shoes (IOI19_shoes) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#include "grader.cpp"
using namespace std;
using ll = long long;
const ll maxN = 2e5+5;
ll segtree[800001];
ll query(ll v, ll vl, ll vr, ll ql, ll qr) {
if (ql > qr) return 0;
if (vr == qr && vl == ql) return segtree[v];
ll mid = (vl + vr) / 2;
return query(v*2, vl, mid, ql, min(qr, mid)) + query(v*2 + 1, mid + 1, vr, max(mid + 1, ql), qr);
}
void update(ll v, ll vl, ll vr, ll pos, ll val) {
if (vl == vr) segtree[v] += val;
else {
ll mid = (vl + vr) / 2;
if (pos <= mid) {
update(v*2, vl, mid, pos, val);
}
else{
update(v*2 + 1, mid + 1, vr, pos, val);
}
segtree[v] = segtree[v*2] + segtree[v*2 + 1];
}
}
long long count_swaps(vector <int> v){
ll n = v.size();
map<ll, vector<ll> > Neg, Pos;
for(ll i = 0; i < n; i++){
if(v[i] < 0) Neg[- v[i]].push_back(i+1);
else Pos[v[i]].push_back(i+1);
}
ll res = 0;
vector<ll> ind(maxN, 0);
vector<bool> volt(n+1, 0);
vector<pair<ll, ll> > pairs;
for(ll i = 0; i < n; i++) {
if(volt[i]) continue;
ll val = abs(v[i]);
ll x = Neg[val][ind[val]];
ll y = Pos[val][ind[val]++];
volt[x-1] = volt[y-1] = 1;
pairs.push_back({min(x, y), max(x, y)});
if(x < y) {
res += y-x-1;
}
else {
res += x-y;
}
}
ll over = 0;
for(auto p : pairs) {
over += query(1, 1, n, p.first, p.second);
update(1, 1, n, p.second, 1);
}
return res - over;
}