Submission #405671

#TimeUsernameProblemLanguageResultExecution timeMemory
405671Tc14Arranging Shoes (IOI19_shoes)C++17
30 / 100
1096 ms26608 KiB
//#pragma GCC optimize("O3")
#include <bits/stdc++.h>
#include "shoes.h"
using namespace std;
#define ve vector
typedef long long ll;
typedef pair<int, int> pii;
const int INF = 1e9 + 10;

struct SegmentTree {

    int Cap;
    ve<int> Seg;

    int left(int x) { return 2 * x; }
    int right(int x) { return 2 * x + 1; }
    int parent(int x) { return x / 2; }

    void build(int a) {
        Cap = 1 << (int)ceil(log2(a));
        Seg = ve<int>(2 * Cap);
    }

    int query(int a, int b) {
        return query(a, b, 0, Cap - 1, 1);
    }

    int query(int a, int b, int i, int j, int curr) {

        if (a <= i && j <= b) return Seg[curr];
        if (b < i || j < a) return 0;

        int m = (i + j) / 2;
        return query(a, b, i, m, left(curr)) + query(a, b, m + 1, j, right(curr));
    }

    void update(int p) {

        Seg[Cap + p] = 1;
        int curr = parent(Cap + p);

        while (curr != 0) {
            Seg[curr] = Seg[left(curr)] + Seg[right(curr)];
            curr = parent(curr);
        }
    }

};

ll count_swaps(ve<int> S) {

    int n;
    ve<int> A;
    ve<pii> P;
    map<int, ve<int>> M;
    SegmentTree Seg;

    n = (int)S.size() / 2;

    for (int i = 0; i < 2 * n; i++) {
        int s = S[i];
        if (s < 0) P.push_back({i, -s});
        else M[s].push_back(i);
    }

    int ans = INF;
    do {

        A = ve<int>(2 * n);
        map<int, int> X;

        for (int i = 0; i < n; i++) {
            int s = P[i].second;
            int j = X[s]++;

            A[P[i].first] = 2 * i;
            A[M[s][j]] = 2 * i + 1;
        }

        Seg.build(2 * n);
        int a = 0;
        for (int i = 0; i < 2 * n; i++) {
            a += Seg.query(A[i], 2 * n - 1);
            Seg.update(A[i]);
        }

        ans = min(ans, a);
    }
    while (next_permutation(P.begin(), P.end()));

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