Submission #1364620

#TimeUsernameProblemLanguageResultExecution timeMemory
1364620takoshanavaArranging Shoes (IOI19_shoes)C++20
100 / 100
288 ms150692 KiB
#include "shoes.h"
#include <bits/stdc++.h>
//#define int long long
#define pb push_back
#define fs first
#define sc second
using namespace std;

const int MAXN = 400005;
long long bit[MAXN];

void upd(int idx, long long val){
    while(idx < MAXN){
        bit[idx] += val;
        idx += idx & -idx;
    }
}

long long get(int idx){
    long long res = 0;
    while(idx > 0){
        res += bit[idx];
        idx -= idx & -idx;
    }
    return res;
}

long long count_swaps(vector<int> s){
    fill(bit, bit + MAXN, 0);

    int n = (int)s.size();
    map<int, deque<int>> L, R;
    vector<pair<int,int>> p;
    p.reserve(n / 2);

    for(int i = 0; i < n; i++){
        int x = s[i];
        int sz = abs(x);

        if(x > 0){
            if(!R[sz].empty()){
                int j = R[sz].front();
                R[sz].pop_front();
                p.pb({j, i});
            }else{
                L[sz].pb(i);
            }
        }else{
            if(!L[sz].empty()){
                int j = L[sz].front();
                L[sz].pop_front();
                p.pb({i, j});
            }else{
                R[sz].pb(i);
            }
        }
    }

    sort(p.begin(), p.end(), [](const pair<int,int>& a, const pair<int,int>& b){
        return min(a.fs, a.sc) < min(b.fs, b.sc);
    });

    vector<int> tr(n);
    for(int i = 0; i < (int)p.size(); i++){
        tr[p[i].fs] = 2 * i + 1;
        tr[p[i].sc] = 2 * i + 2;
    }

    long long ans = 0;
    for(int i = 0; i < n; i++){
        ans += i - get(tr[i]);
        upd(tr[i], 1);
    }
    return ans;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...