| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1356021 | po_rag526 | Arranging Shoes (IOI19_shoes) | C++20 | 0 ms | 0 KiB |
#include "shoes.h"
#include<bits/stdc++.h>
using namespace std;
vector<int> t;
queue<int> l[100100];
queue<int> r[100100];
int ch[200100];
int fw[200100];
int N;
void upd(int now){
for(int i=now;i<=N-1;i+=i&-i){
fw[i]++;
}
}
int qry(int now){
int ret=0;
for(int i=now;i>=1;i-=i&-i){
ret+=fw[i];
}
return ret;
}
long long count_swaps(std::vector<int> s) {
N=s.size();
long long ans=0;
for(int i=0;i<s.size();i++){
if(s[i]<0)l[abs(s[i])].push(i);
if(s[i]>0)r[abs(s[i])].push(i);
}
for(int i=0;i<s.size();i++){
if(ch[i])continue;
ch[i]=1;
int pos;
if(s[i]<0){
while(!r[abs(s[i])].empty() && ch[r[abs(s[i])].front()])r[abs(s[i])].pop();
pos=r[abs(s[i])]
ch[pos]=1;
int out=qry(pos-1)-qry(i+1);
ans+=1ll*(pos-i-1-out);
upd(pos);
}
else{
while(!l[abs(s[i])].empty() && ch[l[abs(s[i])].front()])l[abs(s[i])].pop();
pos=l[abs(s[i])]
ch[pos]=1;
int out=qry(pos-1)-qry(i+1);
ans+=1ll*(pos-i-out);
upd(pos);
}
}
return ans;
}