Submission #1135911

#TimeUsernameProblemLanguageResultExecution timeMemory
1135911nikolashamiArranging Shoes (IOI19_shoes)C++20
100 / 100
62 ms22120 KiB
#include<bits/stdc++.h>
using namespace std;
using ll=long long;

const int N=1e5+2;
set<int>ps[N],ng[N];
int b[N<<1],bit[N<<1],n;
     
int get(int k){
    int s=0;++k;
    while(k>0){
        s+=bit[k];
        k-=k&-k;
    }
    return s;
}
 
void add(int k,int x){
    ++k;
    while(k<=n){
        bit[k]+=x;
        k+=k&-k;
    }
}

void reset(){
    for(int i=0;i<=n;++i){
        if(i<N)ps[i].clear();
        if(i<N)ng[i].clear();
        bit[i]=0;
        b[i]=0;
    }
}

ll count_swaps(vector<int>a){
    n=a.size();

    for(int i=0;i<n;++i){
        if(a[i]>0)ps[a[i]].insert(i);
        else ng[-a[i]].insert(i);
    }

    ll ans=0;
    for(int i=0,j;i<n;++i){
        if(b[i])continue;
        if(a[i]>0){
            j=*ng[a[i]].begin();
            ng[a[i]].erase(ng[a[i]].begin());
            ps[a[i]].erase(ps[a[i]].find(i));
        }
        if(a[i]<0){
            j=*ps[-a[i]].begin();
            ps[-a[i]].erase(ps[-a[i]].begin());
            ng[-a[i]].erase(ng[-a[i]].find(i));
            --ans;
        }
        ans+=j-i-(get(j)-get(i-1));
        b[i]=b[j]=1;
        add(i,1);
        add(j,1);
    }

    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...