Submission #1016203

#TimeUsernameProblemLanguageResultExecution timeMemory
1016203BestCrazyNoobArranging Shoes (IOI19_shoes)C++17
100 / 100
102 ms73820 KiB
#include <iostream>
#include <vector>
#include <queue>

using namespace std;

struct SegTree {
    int sz;
    vector<int> tree;
    int ql, qr;
    void merge(int i) {
        tree[i] = tree[2*i]+tree[2*i+1];
    }
    SegTree(int N) {
        sz = 1;
        while (sz < N) sz *= 2;
        tree.resize(2*sz);
        for (int i = sz; i < sz+N; i++) tree[i] = 1;
        for (int i = sz+N; i < 2*sz; i++) tree[i] = 0;
        for (int i = sz-1; i >= 1; i--) merge(i);
    }
    int __query(int ni, int nl, int nr) {
        if (qr <= nl || nr <= ql) return 0;
        if (ql <= nl && nr <= qr) return tree[ni];
        int nm = (nl+nr)/2;
        return __query(2*ni, nl, nm) + __query(2*ni+1, nm, nr);
    }
    int query(int l, int r) {
        ql = l;
        qr = r;
        return __query(1, 0, sz);
    }
    void set0(int i) {
        i += sz;
        tree[i] = 0;
        for (i /= 2; i >= 1; i /= 2) {
            merge(i);
        }
    }
};

long long count_swaps(vector<int> S) {
    const int N = S.size() / 2;
    vector<queue<int>> queues(N+1); // Index where given numbers appear
    vector<int> other(2*N); // Index of other pair element
    for (int i = 0; i < 2*N; i++) {
        const int x = abs(S[i]);
        if (!queues[x].size() || S[queues[x].front()] == S[i]) {
            queues[x].push(i);
        } else {
            const int j = queues[x].front();
            queues[x].pop();
            other[i] = j;
            other[j] = i;
        }
    }
    SegTree seg(2*N);
    long long ans = 0;
    for (int i = 0; i < 2*N; i++) {
        if (other[i] < i) continue;
        if (S[i] > 0) ans++; // this is a right shoe, to be swapped at the end
        ans += seg.query(i+1, other[i]);
        seg.set0(i);
        seg.set0(other[i]);
    }
    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...