제출 #387546

#제출 시각아이디문제언어결과실행 시간메모리
387546timmyfengMonochrome Points (JOI20_monochrome)C++17
100 / 100
1384 ms6508 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 200000;

template <class T>
struct fenwick {
    vector<T> tree;
    int n;

    fenwick(int n) : n(n) {
        tree.resize(n + 1);
    }

    void update(int a, T x) {
        for ( ; a <= n; a += (a & -a)) {
            tree[a] += x;
        }
    }

    T query(int a) {
        T res = 0;
        for ( ; a > 0; a -= (a & -a)) {
            res += tree[a];
        }
        return res;
    }

    int lower_bound(T k) {
        int res = 0;
        T sum = 0;
        for (int i = __lg(n); i >= 0; --i) {
            if (res + (1 << i) <= n && sum + tree[res + (1 << i)] < k) {
                res += 1 << i;
                sum += tree[res];
            }
        }
        return res + 1;
    }
};

int black[N], white[N], n;

long long calc(int k) {
    vector<array<int, 2>> segments;
    for (int i = 0; i < n; ++i) {
        int b = black[i], w = white[(i + k) % n];
        if (b > w) {
            swap(b, w);
        }
        segments.push_back({b, w});
    }
    sort(segments.begin(), segments.end());

    long long ans = 0;
    fenwick<int> fenw(2 * n);
    for (auto [l, r] : segments) {
        ans += fenw.query(r) - fenw.query(l);
        fenw.update(r, 1);
    }

    return ans;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);

    string s;
    cin >> n >> s;

    int b = 0, w = 0;
    for (int i = 0; i < 2 * n; ++i) {
        if (s[i] == 'B') {
            black[b++] = i;
        } else {
            white[w++] = i;
        }
    }

    int low = 0, high = n - 1;
    while (low < high) {
        int mid = (low + high) / 2;
        if (calc(mid) < calc(mid + 1)) {
            low = mid + 1;
        } else {
            high = mid;
        }
    }

    cout << calc(low) << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...