#include <bits/stdc++.h>
using namespace std;
#include "shoes.h"
const int MAXN=1e5+5;
int seg[MAXN*4],offset=1;
void update(int idx,int val){
idx+=offset;
seg[idx]=val;
idx/=2;
while(idx>0){
seg[idx]=seg[idx*2]+seg[idx*2+1];
idx/=2;
}
}
int query(int node,int qlo,int qhi,int lo,int hi){
if(qlo>qhi)return 0;
if(lo>=qlo && hi<=qhi)return seg[node];
if(lo>qhi || hi<qlo)return 0;
int mid=(lo+hi)/2;
return query(node*2,qlo,qhi,lo,mid)+query(node*2+1,qlo,qhi,mid+1,hi);
}
long long count_swaps(std::vector<int> s) {
const int N=s.size();
while(offset<N)offset*=2;
queue<int> q[N];
for(int i=0;i<N;i++){
if(s[i]>0)q[s[i]].push(i);
update(i,1);
}
long long ans=0;
for(int i=0;i<N;i++){
if(s[i]<0){
int idx=q[abs(s[i])].front();
q[abs(s[i])].pop();
ans+=query(1,0,i-1,0,offset-1);
update(i,0);
// cout<<ans<<' ';
ans+=query(1,0,idx-1,0,offset-1);
update(idx,0);
// cout<<ans<<endl;
}
}
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... |