답안 #620691

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
620691 2022-08-03T08:14:30 Z Blagojce Election (BOI18_election) C++11
0 / 100
7 ms 340 KB
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <set>
#include <unordered_map>
#include <unordered_set>
#include <string>
#include <string.h>
#include <bitset>
#include <numeric>
#include <utility>

#define fr(i, n, m) for(int i = (n); i <= (m); i ++)
#define pb push_back
#define st first
#define nd second
#define pq priority_queue
#define all(x) begin(x), end(x)

using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int,int> pii;
const int mxn = 2e5;
const ll mod = 998244353;
const ll inf = 1e18;

int n;
string s;


int pref[mxn];
int suff[mxn];



pair<int,int> q_prefix(int l, int r){
    int mi = 0;
    int id = l-1;
    for(int i = l; i <= r; i ++){
        if(pref[i] - pref[l-1] < mi){
            mi = pref[i] - pref[l-1];
            id = i;
        }
    }
    return {abs(mi),id};
}

pair<int,int> q_suffix(int l, int r){
    int mi = 0;
    int id = r+1;
    for(int i = r; i >= l; i --){
        if(suff[i] - suff[r+1] < mi){
            mi = suff[i] - suff[r+1];
            id = i;
        }
    }
    return {abs(mi), id};
}


int solve(int l, int r){
    int RET = 0;
    
    pii A = q_prefix(l, r);
    pii B = q_suffix(l, r);
    
    if(A.st == 0) return B.st;
    if(B.st == 0) return A.st;
    
    if(A.nd < B.nd){
        return A.st + B.st;
    }
    
    pii L = q_prefix(l, B.nd-1);
    pii R = q_suffix(A.nd+1, r);
    
    RET = A.st + R.st;
//    cout<<"here : "<<RET<<" "<<L.st<<" " <<R.st<<endl;
    int init_sum_l = pref[l-1];
    int init_sum_r = suff[r+1];
    
    int add = L.st;
    int Max = pref[B.nd-1]+L.st;
    fr(i, B.nd, A.nd){
        if(pref[i] + L.st + add < init_sum_l){
            ++add;
        }
        Max = max(Max, pref[i] + L.st + add);
    }
    int rise = Max - init_sum_l;
   
    int min_point = suff[A.nd+1] + R.st - rise;
    
    RET += max(0, init_sum_r - min_point);
    
    
    
////    int MIN = 1e9;
//////    cout<<init_sum_l<<endl;
////
////    int max_height = pref[B.nd-1];
////    fr(i, B.nd, A.nd){
//////        cout<<pref[i]<<' ';
////        MIN = min(MIN, (pref[i] + L.st));
////            // (init_sum_l - MIN) how much should we increase MIN to get above given 0 - init_sum_l
////        max_height = max(max_height, (pref[i] + L.st) + (init_sum_l - MIN));
////    }
//////    cout<<endl;
//////    cout<<max_height<<endl;
//    int offset = max_height - init_sum_l;
//
//
//    int min_point = suff[A.nd+1] + R.st - offset;
//    RET += max(0, init_sum_r - min_point);
//
    return RET;
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n;
    cin >> s;
    
    
    for(int i = 1; i <= n; i ++){
        pref[i] = pref[i-1];
        if(s[i-1] == 'C') pref[i] += 1;
        if(s[i-1] == 'T') pref[i] -= 1;
    }
    for(int i = n; i >= 1; i --){
        suff[i] = suff[i+1];
        if(s[i-1] == 'C') suff[i] += 1;
        if(s[i-1] == 'T') suff[i] -= 1;
    }
    int Q;
    cin >> Q;
    fr(i, 1, Q){
        int l, r;
        cin >> l >> r;
        cout<<solve(l, r)<<endl;
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 340 KB Output isn't correct
2 Halted 0 ms 0 KB -