Submission #1016291

#TimeUsernameProblemLanguageResultExecution timeMemory
1016291AriadnaArranging Shoes (IOI19_shoes)C++14
100 / 100
135 ms141756 KiB
#include <bits/stdc++.h>
#include "shoes.h"
#define ll long long

using namespace std;

struct Segtree {
    int n;
    vector<int> st;

    Segtree(vector<int>& a) {
        n = (int)a.size();
        st = vector<int>(4*n);
        build(1, 0, n-1, a);
    }

    void build(int p, int l, int r, const vector<int>& a) {
        if (l == r) st[p] = a[l];
        else {
            int m = (l+r)/2;
            build(2*p, l, m, a);
            build(2*p+1, m+1, r, a);
            st[p] = st[2*p]+st[2*p+1];
        }
    }

    void change(int p, int l, int r, int i) {
        if (l == r) st[p] = 1-st[p];
        else {
            int m = (l+r)/2;
            if (i <= m) change(2*p, l, m, i);
            else change(2*p+1, m+1, r, i);
            st[p] = st[2*p]+st[2*p+1];
        }
    }

    int sum(int p, int l, int r, int i, int j) {
        if (i > j) return 0;
        if (l == i && r == j) return st[p];
        int m = (l+r)/2;
        return sum(2*p, l, m, i, min(m, j))+sum(2*p+1, m+1, r, max(i, m+1), j);
    }

    void change(int i) { change(1, 0, n-1, i); }
    int sum(int i, int j) { return sum(1, 0, n-1, i, j); }
};

ll count_swaps(vector<int> S) {
    ll ans = 0;
    int n = (int)S.size();

    vector<int> pair(n);
    vector<queue<int>> pos(n/2+1), neg(n/2+1);

    for (int i = n-1; i >= 0; --i) {
        if (S[i] > 0) {
            if (neg[S[i]].empty()) {
                pos[S[i]].push(i);
                pair[i] = -1;
            } else {
                pair[i] = neg[S[i]].front();
                neg[S[i]].pop();
            }
        } else {
            if (pos[-S[i]].empty()) {
                neg[-S[i]].push(i);
                pair[i] = -1;
            } else {
                pair[i] = pos[-S[i]].front();
                pos[-S[i]].pop();
            }
        }
    }

    vector<int> a(n, 1);
    Segtree St(a);

    for (int i = 0; i < n; ++i) {
        if (pair[i] == -1) continue;
        ans += St.sum(i+1, pair[i]-1);
        if (S[i] > 0) ++ans;
        St.change(i);
        St.change(pair[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...