Submission #1232836

#TimeUsernameProblemLanguageResultExecution timeMemory
1232836coco2311Arranging Shoes (IOI19_shoes)C++17
100 / 100
129 ms144668 KiB
#include "shoes.h"
#include <cmath>
#include <queue> 
#include <cstdio>
using namespace std;

int zp;

long long count_swaps(std::vector<int> s){
	long long N=s.size();
	N/=2;
    zp=1<<(int)ceil(log2(N*2));
    long long arb[2*zp];
    for(int i=0;i<2*zp;i++){
        arb[i]=0;
    }
    long long shoes[2*N];
    for(int i=0;i<2*N;i++){
        shoes[i]=s[i];
        shoes[i]+=N;
    }
    queue<long long> pairD[2*N+1];
    long long pP[2*N+1];
    for(int i=0;i<N*2;i++){
        long long p=shoes[i];
        p-=N;
        p*=-1;
        p+=N;
        if(!pairD[p].empty()){
            pP[i]=pairD[p].front();
            pP[pP[i]]=i;
            pairD[p].pop();
        }
        else{
            pairD[shoes[i]].push(i);
        }
    }
    long long swaps=0;
    for(int i=0;i<2*N;i++){
        if(pP[i]>i){
            long long d=pP[i]-i;
            if(shoes[i]<N){
                d--;
            }
            long long l=i+zp,r=pP[i]+zp,val=0;
            while(l<=r){
                if(l%2==1){
                    val+=arb[l];
                    l++;
                }
                if(r%2==0){
                    val+=arb[r];
                    r--;
                }
                l/=2;
                r/=2;
            }
            d-=val;
            swaps+=d;
            l=pP[i]+zp;
            while(l>=1){
                arb[l]+=1;
                l/=2;
            }
        }
    }
    return swaps;
}
#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...