Submission #1356027

#TimeUsernameProblemLanguageResultExecution timeMemory
1356027po_rag526Arranging Shoes (IOI19_shoes)C++20
100 / 100
72 ms139888 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;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;
}
int s[200100];
long long count_swaps(std::vector<int> vec) {
    N=vec.size();
    long long ans=0;
    for(int i=0;i<vec.size();i++){
        s[i+1]=vec[i];
    }
    for(int i=1;i<=N;i++){
        if(s[i]<0)l[abs(s[i])].push(i);
        if(s[i]>0)r[abs(s[i])].push(i);
    }
    for(int i=1;i<=N;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])].front();
            ch[pos]=1;
            int out=qry(pos)-qry(i);
            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])].front();
            ch[pos]=1;
            int out=qry(pos)-qry(i);
            ans+=1ll*(pos-i-out);
            upd(pos);
        }
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...