Submission #362275

#TimeUsernameProblemLanguageResultExecution timeMemory
362275dooweyMonochrome Points (JOI20_monochrome)C++14
100 / 100
1814 ms10952 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

#define fi first
#define se second
#define mp make_pair
#define fastIO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

const int N = (int)4e5 + 100;

int col[N];
int n, m;
vector<int> C[2];
int segt[N*2];

void upd(int id, int v){
    id += m;
    while(id > 0){
        segt[id] += v;
        id /= 2;
    }
}

int get(int l, int r){
    l += m;
    r += m;
    int cum = 0;
    while(l <= r){
        if(l % 2 == 1) cum += segt[l ++ ];
        if(r % 2 == 0) cum += segt[r -- ];
        l /= 2;
        r /= 2;
    }
    return cum;
}

ll f(int k){
    vector<pii> seg;
    for(int i = 0 ; i < n; i ++ ){
        seg.push_back(mp(C[0][i], C[1][(i + k) % n]));
    }
    for(auto &x : seg){
        if(x.fi > x.se) swap(x.fi, x.se);
    }
    for(int i = 0 ; i < m * 2; i ++ ){
        segt[i]=0;
    }
    sort(seg.begin(), seg.end());
    ll ff = 0;
    for(auto q : seg){
        ff += get(q.fi, q.se);
        upd(q.se, +1);
    }
    return ff;
}

int main(){
    fastIO;
    cin >> n;
    m = n * 2;
    char qf;
    for(int i = 0; i < m ; i ++ ){
        cin >> qf;
        if(qf == 'B'){
            col[i]=0;
        }
        else{
            col[i]=1;
        }
        C[col[i]].push_back(i);
    }
    ll high = f(0);
    int li = 1;
    int ri = n;
    int mid;
    while(li < ri){
        mid = (li + ri) / 2;
        if(f(mid) < f(mid + 1)){
            li = mid + 1;
        }
        else{
            ri = mid;
        }
    }
    high = max(high, f(li));
    cout << high << "\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...