Submission #1021163

#TimeUsernameProblemLanguageResultExecution timeMemory
1021163vjudge1Arranging Shoes (IOI19_shoes)C++17
100 / 100
130 ms142896 KiB
#include "shoes.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector <ll>;
using vi = vector <int>;

const ll MAXN = 1E5+16;

struct Fenwick {
    vll tree;
    ll n;

    Fenwick (ll n): tree(n, 0), n(n) {}

    void update (ll id, ll val) {
        for (; id < n; id |= id+1) tree[id] += val;
    }

    ll query (ll ql, ll qr) { return query(qr) - query(ql-1); }
    ll query (ll id) {
        ll ans = 0;
        for (; id >= 0; id &= id+1, id--) ans += tree[id];
        return ans;
    }
};

queue <ll> whP[MAXN];
queue <ll> whN[MAXN];
ll count_swaps (vi A) {
    vll ve(A.begin(), A.end());
    ll n = ve.size();
    for (ll i = 0; i < n; i++) {
        if (ve[i] > 0) whP[ve[i]].push(i);
        else whN[-ve[i]].push(i);
    }
    ll ans = 0;
    vector <char> used(n, true);
    Fenwick ft(n);
    for (ll i = 0; i < n; i++) ft.update(i, 1);
    for (ll i = 0; i < n; i++) {
        if (!ft.query(i, i)) continue;
        ll x = -ve[i];
        ans += x < 0;
        ll j = (ve[i] > 0 ? whN[ve[i]].front() : whP[-ve[i]].front());
        assert((ve[i] > 0 ? whP[ve[i]] : whN[-ve[i]]).front() == i);
        // cerr << i << ' ' << j << '\n';
        whN[abs(ve[i])].pop();
        whP[abs(ve[i])].pop();
        assert(ve[i]+ve[j] == 0);
        ft.update(i, -1);
        ft.update(j, -1);
        ans += ft.query(i, j);
    }
    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...