Submission #1138862

#TimeUsernameProblemLanguageResultExecution timeMemory
1138862anmattroiArranging Shoes (IOI19_shoes)C++20
100 / 100
173 ms32116 KiB
#include "shoes.h"
#include <bits/stdc++.h>
#define maxn 100005
using namespace std;

int n, m;
int tmp[maxn];
set<int> O[maxn], C[maxn], R;
int a[2*maxn], bit[2*maxn];

void upd(int u, int d) {
    for (int i = u; i > 0; i -= i & -i) bit[i] += d;
}

int get(int u) {
    int kq = 0;
    for (int i = u; i <= n+n; i += i & -i) kq += bit[i];
    return kq;
}

long long count_swaps(vector<int> s) {
	n = s.size()/2;
	for (int i = 0, id = 0; i < s.size(); i++)
        if (s[i] > 0) tmp[++id] = s[i];
    sort(tmp + 1, tmp + n + 1);
    m = unique(tmp + 1, tmp + n + 1) - tmp - 1;

    for (int i = 0; i < s.size(); i++) {
        int mult = (s[i] > 0 ? 1 : -1);
        s[i] = mult * (lower_bound(tmp + 1, tmp + m + 1, s[i]*mult) - tmp);
    }
    for (int i = 0; i < s.size(); i++) {
        R.insert(i);
        if (s[i] < 0) O[-s[i]].insert(i);
        else C[s[i]].insert(i);
    }
    for (int i = 1; i <= 2*n; i += 2) {
        int H = *R.begin(); R.erase(R.begin());
        int spr = s[H];
        if (spr < 0) {
            a[H] = i;
            a[*C[-spr].begin()] = i+1;
            R.erase(*C[-spr].begin());
            O[-spr].erase(O[-spr].begin());
            C[-spr].erase(C[-spr].begin());
        } else {
            a[H] = i+1;
            a[*O[spr].begin()] = i;
            R.erase(*O[spr].begin());
            O[spr].erase(O[spr].begin());
            C[spr].erase(C[spr].begin());
        }

    }

    int64_t inv = 0;
    for (int i = 0; i < 2*n; i++) {
        inv += get(a[i]+1);
        upd(a[i], 1);
    }
    return inv;

}

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