제출 #1263758

#제출 시각아이디문제언어결과실행 시간메모리
1263758piolkArranging Shoes (IOI19_shoes)C++20
50 / 100
1097 ms21320 KiB
#include <bits/stdc++.h>
using namespace std;

int64_t count_swaps(vector<int> S){
    int n=S.size();

    vector<bool> skip(n);
    vector<int> newPos(n);
    iota(newPos.begin(),newPos.end(),1);
    vector<pair<priority_queue<int,vector<int>,greater<>>,priority_queue<int,vector<int>,greater<>>>> pqs(n+1);

    for (int i=0;i<n;i++){
        if (S[i]>0){
            pqs[S[i]].first.push(i);
        } else {
            pqs[S[i]*-1].second.push(i);
        }
    }

    int64_t swaps=0;

    for (int i=0;i<n;i++){
        if (skip[i]) continue;

        int now=newPos[i];
        int next;

        if (S[i]>0){
            //szukam w ujemnych na .second
            next=pqs[S[i]].second.top();
            pqs[S[i]].second.pop();

            pqs[S[i]].first.pop(); //usuwamy now
        } else {
            //szukam w dodatnich na .first
            next=pqs[S[i]*-1].first.top();
            pqs[S[i]*-1].first.pop();

            pqs[S[i]*-1].second.pop();//usuwamy now
        }

        for (int j=i+1;j<next;j++){
            newPos[j]++;
        }

        skip[i]=true;
        skip[next]=true;

        next=newPos[next];

        swaps+=next-now-1;

        if (S[i]>0) swaps++;
    }
    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...