#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
struct segtree{
int n;
vector<int>tree;
segtree(int n):n(n),tree(2*n,0){}
void update(int pos,int val){
tree[pos+=n]=val;
for(pos/=2;pos>0;pos/=2){
tree[pos]=tree[2*pos]+tree[2*pos^1];
}
}
int sum(int l,int r){
int ans=0;
for(l+=n,r+=n;l<r;l/=2,r/=2){
if(l%2){
ans+=tree[l++];
}
if(r%2){
ans+=tree[--r];
}
}
return ans;
}
};
long long count_swaps(std::vector<int> s) {
int n=s.size()/2;
ll ans=0;
vector<vector<int>>l(n),r(n);
for(int i=2*n-1;i>=0;i--){
if(s[i]>0){
r[s[i]-1].push_back(i);
}else{
l[-s[i]-1].push_back(i);
}
}
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>pq;
for(int i=0;i<n;i++){
if(!l[i].empty()){
pq.push({min(l[i].back(),r[i].back()),i});
}
}
segtree seg(2*n);
for(int i=0;i<n;i++){
pair<int,int>p=pq.top();
pq.pop();
int li=l[p.second].back(),ri=r[p.second].back();
li+=seg.sum(li,2*n);
ri+=seg.sum(ri,2*n);
seg.update(l[p.second].back(),1);
seg.update(r[p.second].back(),1);
l[p.second].pop_back();r[p.second].pop_back();
if(!l[p.second].empty()){
pq.push({min(l[p.second].back(),r[p.second].back()),p.second});
}
if(ri==2*i){
ans+=abs(li-2*i);
}else ans+=abs(li-2*i)+abs(ri-2*i-1)+(li>ri);
}
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... |