Submission #921574

#TimeUsernameProblemLanguageResultExecution timeMemory
921574GrandTiger1729Monochrome Points (JOI20_monochrome)C++17
35 / 100
2011 ms6616 KiB
#include <bits/stdc++.h>
using namespace std;

struct BIT
{
    int n;
    vector<int> bit;
    BIT(int n_) : n(n_), bit(n + 1) {}
    void add(int i, int u)
    {
        for (; i <= n; i += i & -i)
        {
            bit[i] += u;
        }
    }
    int query(int i)
    {
        int ret = 0;
        for (; i > 0; i -= i & -i)
        {
            ret += bit[i];
        }
        return ret;
    }
    int query(int l, int r)
    {
        return query(r) - query(l);
    }
};

int main()
{
    cin.tie(0)->sync_with_stdio(0);
    int n;
    cin >> n;
    int N = 2 * n;
    string a;
    cin >> a;
    vector<int> b, c;
    for (int i = 0; i < N; i++)
    {
        if (a[i] == 'B')
        {
            b.push_back(i);
        }
        else
        {
            c.push_back(i);
        }
    }
    auto solve = [&](int t) -> long long
    {
        vector<pair<int, int>> res;
        for (int i = 0; i < t; i++)
        {
            res.emplace_back(min(b[i], c[n - t + i]), max(b[i], c[n - t + i]));
        }
        for (int i = t; i < n; i++)
        {
            res.emplace_back(min(b[i], c[i - t]), max(b[i], c[i - t]));
        }
        sort(res.begin(), res.end(), [&](pair<int, int> x, pair<int, int> y)
        {
            if (x.second != y.second)
            {
                return x.second < y.second;
            }
            return x.first < y.first;
        });
        long long ret = 0;
        BIT bit(2 * n);
        for (auto &[l, r] : res)
        {
            ret += bit.query(l, r);
            bit.add(l + 1, -1);
            bit.add(r + 1, 1);
        }
        return ret;
    };
    long long ans = 0;
    for (int i = 0; i <= n; i++)
    {
        ans = max(ans, solve(i));
    }
    cout << ans << '\n';
    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...