Submission #294399

#TimeUsernameProblemLanguageResultExecution timeMemory
294399cuom1999Monochrome Points (JOI20_monochrome)C++14
100 / 100
69 ms3468 KiB
#include <bits/stdc++.h>
using namespace std;

// finding max distance

int main() {
    //freopen("input.txt", "r", stdin);
    ios::sync_with_stdio(0);
    cin.tie(NULL);

    int n;
    cin >> n;
    string s;
    cin >> s;

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

    auto solve = [&](int k) {
        long long res = 0;
        for (int i = 0; i < n; i++) {
            int dist = abs(black[i] - white[(i + k) % n]);
            res += min(dist, 2 * n - dist);
        }

        return res;
    };

    auto findMax = [&](int l, int r) {
        int lower = l, upper = r;
        while (lower < upper) {
            int mid = (lower + upper) / 2;
            if (solve(mid) <= solve(mid + 1)) {
                lower = mid + 1;
            }
            else upper = mid;
        }

        return solve(lower);
    };
    long long res;
    
    if (solve(0) >= solve(n - 1)) {
        // up - down - up
        // find last i: solve(0) <= solve(i)

        int s0 = solve(0);

        int lower = 0, upper = n - 1;
        while (lower < upper) {
            int mid = (lower + upper + 1) / 2;
            if (solve(mid) >= s0) {
                lower = mid;
            }
            else upper = mid - 1;
        } 
        res = findMax(0, lower);
    }   
    else {
        // down - up - down
        // find the first i: solve(i) >= solve(n - 1)
        int sn = solve(n - 1);
        int lower = 0, upper = n - 1;
        while (lower < upper) {
            int mid = (lower + upper) / 2;
            if (solve(mid) >= sn) {
                upper = mid;                                                                                                    
            }
            else lower = mid + 1;                                                                                                                                                                                                                                                                                                                                                   
        }
        res = findMax(lower, n - 1);
    }     
    cout << (res - n) / 2 << endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...