#include <bits/stdc++.h>
#define forsn(i,s,n) for(int i=s; i<n; ++i)
#define forn(i,n) forsn(i,0,n)
#define pb push_back
#define snd second
#define fst first
#define all(x) x.begin(), x.end()
#define imp(x) for(auto __:x)cout<<__<<" "; cout<<endl;
#define sz(c) int((c).size())
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
typedef vector<int> vi;
const int N=200'010;
struct FTree{
vector<long long> fen;
void init(){
fen.resize(N, 0);
}
ll sum(int x){
ll v=0;
for(;x;x-=(x&-x)){
v+=fen[x];
}
return v;
}
void upd(int x, int v){
for(;x<N;x+=(x&-x)){
fen[x]+=v;
}
}
};
ll count_swaps(vi s) {
int n=sz(s);
ll ans=0;
FTree fen;
fen.init();
forsn(i,1,N)fen.upd(i,1);
map<int, set<int>> mp;
for(int i=0;i<n;i++){
mp[s[i]].insert(i);
}
for(int i=0; i<n; i++){
//~ cout<<"===================="<<endl;
//~ cout<<s[i]<<endl;
if(s[i]<0){ //left
if(!mp[s[i]].count(i))continue;
mp[s[i]].erase(i);
if(mp[abs(s[i])].empty())continue;
int v=*mp[abs(s[i])].begin();
int cnt_pos=fen.sum(v)-fen.sum(i+1);
//~ cout<<cnt_pos<<endl;
ans+=cnt_pos;
int l=i+1, r=v+1;
fen.upd(l, -1);
fen.upd(r, -1);
mp[abs(s[i])].erase(mp[abs(s[i])].begin());
}else{ //right
if(!mp[s[i]].count(i))continue;
mp[s[i]].erase(i);
if(mp[-s[i]].empty())continue;
int v=*mp[-s[i]].begin();
int cnt_pos=fen.sum(v)-fen.sum(i+1);
//~ cout<<cnt_pos<<endl;
ans+=cnt_pos+1;
int l=i+1, r=v+1;
fen.upd(l, -1);
fen.upd(r, -1);
mp[-s[i]].erase(mp[-s[i]].begin());
}
}
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... |