Submission #876965

#TimeUsernameProblemLanguageResultExecution timeMemory
876965parlimoosGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++14
100 / 100
331 ms763624 KiB
#pragma GCC optimize("Ofast")
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;
#define pb push_back
#define pp pop_back
#define lb lower_bound
#define ub upper_bound
#define cl clear
#define bg begin
#define arr(x) array<int , x>
#define endl '\n'

int n;
vector<int> s;
int dp[402][402][402][3];
vector<int> is[3];
int infs[400][3];

void f(int c0 , int c1 , int c2 , int rel){
    arr(3) cnt = {c0 , c1 , c2};
    int len = n - c0 - c1 - c2;
    int inx , hrkt;
    int res = 0;
    if(is[rel].empty() or (int)is[rel].size() <= cnt[rel]){
        res = -2;
    }else{
        if(len == 1) res = 0;
        else{
            inx = is[rel][(int)is[rel].size() - cnt[rel] - 1];
            hrkt = max(0 , infs[inx][0] - c0) + max(0 , infs[inx][1] - c1) + max(0 , infs[inx][2] - c2) - 1;
            // cout << infs[inx][0] << " " << infs[inx][1] << " " << infs[inx][2] << " :: " << hrkt << "..\n";

            cnt[rel]++;
            res = (int)1e9;
            for(int i = 0 ; i < 3 ; i++){
                if(i == rel) continue;
                if(dp[cnt[0]][cnt[1]][cnt[2]][i] == -1){
                    f(cnt[0] , cnt[1] , cnt[2] , i);
                }
                // if(c0 == 0 and c1 == 0 and c2 == 0 and rel == 2) cout << cnt[0] << " " << cnt[1] << " " << cnt[2] << " , " << i << "##\n";
                if(dp[cnt[0]][cnt[1]][cnt[2]][i] != -2) res = min(res , hrkt + dp[cnt[0]][cnt[1]][cnt[2]][i]);
            }
            if(res == (int)1e9) res = -2;
        }
    }
    dp[c0][c1][c2][rel] = res;
    // cout << c0 << " " << c1 << " " << c2 << " , " << rel << " , " << res << "::\n" << flush;
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    fill(&dp[0][0][0][0] , &dp[401][401][401][3] , -1);
    cin >> n;
    for(int i = 0 ; i < n ; i++){
        char d;
        cin >> d;
        int dd = 0;
        if(d == 'R') dd = 1;
        else if(d == 'Y') dd = 2;
        is[dd].pb(i);
        s.pb(dd);
    }
    infs[n - 1][s.back()] = 1;
    for(int i = n - 2 ; i >= 0 ; i--){
        infs[i][s[i]] = 1;
        infs[i][0] += infs[i + 1][0];
        infs[i][1] += infs[i + 1][1];
        infs[i][2] += infs[i + 1][2];
    }

    arr(3) allcnt = {0 , 0 , 0};
    for(int i = 0 ; i < 3 ; i++) f(allcnt[0] , allcnt[1] , allcnt[2] , i);

    int o = (int)1e9;
    for(int i = 0 ; i < 3 ; i++) if(dp[allcnt[0]][allcnt[1]][allcnt[2]][i] != -2) o = min(o , dp[allcnt[0]][allcnt[1]][allcnt[2]][i]);
    if(o == (int)1e9) cout << "-1";
    else cout << o;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...