#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
struct BIT{
ll N;
vector<ll> bit;
BIT(ll _n){
N = _n;
bit.resize(N + 5);
}
void upd(ll idx, ll val){
idx++;
for(; idx <= N; idx += idx & -idx) bit[idx] += val;
}
ll get(ll idx){
idx++;
ll ans = 0;
for(; idx >= 1; idx -= idx & -idx) ans += bit[idx];
return ans;
}
ll query(ll l, ll r) { return get(r) - get(l - 1); }
};
long long count_swaps(vector<int> s) {
int N = (int)s.size() / 2;
vector<int> kiri[N + 5], kanan[N + 5];
for(int i = 0; i < 2 * N; i++){
if(s[i] < 0) kiri[abs(s[i])].push_back(i);
else kanan[s[i]].push_back(i);
}
for(int i = 0; i <= N; i++){
reverse(kiri[i].begin(), kiri[i].end());
reverse(kanan[i].begin(), kanan[i].end());
}
vector<int> vis(2 * N + 5);
int ans = 0;
BIT bit(2 * N);
for(int i = 0; i < 2 * N; i++) bit.upd(i, 1);
for(int i = 0; i < 2 * N; i++){
if(s[i] < 0 || vis[i]) continue;
vis[i] = 1, vis[kiri[abs(s[i])].back()] = 1;
ans += abs(bit.get(kiri[abs(s[i])].back()) - bit.get(i)) - (kiri[abs(s[i])].back() < i);
if(kiri[s[i]].back() < i){
bit.upd(kiri[s[i]].back() + 1, 1);
bit.upd(i, -1);
}
else{
bit.upd(i + 1, -1);
bit.upd(kiri[s[i]].back() + 1, 1);
}
kiri[abs(s[i])].pop_back();
kanan[abs(s[i])].pop_back();
}
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... |