제출 #1135269

#제출 시각아이디문제언어결과실행 시간메모리
1135269vibeduckArranging Shoes (IOI19_shoes)C++20
100 / 100
181 ms31716 KiB
#include "shoes.h"
#include <map>
#include <set>
using namespace std;
//#define int long long

struct FenwickTree {
    vector<int> bit;
    int n;

    FenwickTree(int n) {
        this->n = n;
        bit.assign(n, 0);
    }

    FenwickTree(vector<int> const &a) : FenwickTree(a.size()) {
        for (size_t i = 0; i < a.size(); i++)
            add(i, a[i]);
    }

    int sum(int r) {
        int ret = 0;
        for (; r >= 0; r = (r & (r + 1)) - 1)
            ret += bit[r];
        return ret;
    }

    int sum(int l, int r) {
        return sum(r) - sum(l - 1);
    }

    void add(int idx, int delta) {
        for (; idx < n; idx = idx | (idx + 1))
            bit[idx] += delta;
    }
};

long long count_swaps(vector<int> s) {
	long long n = s.size();
    vector<int> tmp(n, 1); FenwickTree in(tmp);
    long long ans = 0; map<int, set<int>> sl, sr;
    for (int i = 0; i < n; i++) {
        if (s[i] < 0) {
            sl[abs(s[i])].insert(i);
        } else {
            sr[abs(s[i])].insert(i);
        }
    }

    for (int i = 0; i < n; i++) {
        if (!in.sum(i, i)) continue;
        int a = abs(s[i]);
        if (s[i] < 0) {
            // left shoe
            auto nxt = sr[a].lower_bound(i);
            int j = *nxt;
            ans += (long long)in.sum(i + 1, j - 1);
            in.add(i, -1); in.add(j, -1);
            sr[a].erase(nxt);
            continue;
        }
        // right shoe
        auto nxt = sl[a].lower_bound(i);
        int j = *nxt;
        ans += (long long)in.sum(i + 1, j - 1) + 1;
        in.add(i, -1); in.add(j, -1);
        sl[a].erase(nxt);
    }

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