Submission #1295835

#TimeUsernameProblemLanguageResultExecution timeMemory
1295835fairkrashGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++20
100 / 100
152 ms137708 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = short int;
ll INF = 3e4;


int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    ll n;
    cin >> n;
    string s;
    cin >> s;
    ll v1 = (ll) 0, v2 = (ll) 0, v3 = (ll) 0;
    vector<ll> pref1(n + 1), pref2(n + 1), pref3(n + 1);
    vector<ll> d1, d2, d3;
    for (ll i = (ll) 0; i < s.size(); i++) {
        if (s[i] == 'R') {
            v1++;
            d1.push_back(i);
        }
        if (s[i] == 'G') {
            v2++;
            d2.push_back(i);
        }
        if (s[i] == 'Y') {
            v3++;
            d3.push_back(i);
        }
        pref1[i] = v1;
        pref2[i] = v2;
        pref3[i] = v3;
    }
    ll mx = max({v1, v2, v3});
    if (mx > n - mx + 1) {
        cout << -1;
        return (ll) 0;
    }
    vector<vector<vector<vector<ll>>>> dp(v1 + 2,
                                          vector<vector<vector<ll>>>(v2 + 2,
                                                                     vector<vector<ll>>(v3 + 2, vector<ll>(3, INF))));
    dp[1][(ll) 0][(ll) 0][(ll) 0] = (ll) 0;
    dp[(ll) 0][1][(ll) 0][1] = (ll) 0;
    dp[(ll) 0][(ll) 0][1][2] = (ll) 0;

    for (ll a = (ll) 0; a <= v1; a++) {
        for (ll b = (ll) 0; b <= v2; b++) {
            for (ll c = (ll) 0; c <= v3; c++) {
                if (a + b + c == (ll) 0)continue;
                {
                    ll e = 0;
                    ll j = 1;
                    if (b != v2) {
                        ll k = d2[b];
                        ll h1 = max((ll)(a-pref1[k]),(ll)0);
                        ll h2 = 0;
                        ll h3 = max((ll)(c-pref3[k]),(ll)0);
                        dp[a][b + 1][c][j] = min((ll) dp[a][b + 1][c][j], (ll) (dp[a][b][c][e] + h1 + h2 + h3));
                    }
                    j = 2;
                    if (c != v3) {
                        ll k = d3[c];
                        ll h1 = max((ll)(a-pref1[k]),(ll)0);
                        ll h2 = max((ll)(b-pref2[k]),(ll)0);
                        ll h3 = 0;
                        dp[a][b][c + 1][j] = min((ll) dp[a][b][c + 1][j], (ll) (dp[a][b][c][e] + h1 + h2 + h3));
                    }
                }
                {
                    ll e = 1;
                    ll j = 2;
                    if (c != v3) {
                        ll k = d3[c];
                        ll h1 = max((ll)(a-pref1[k]),(ll)0);
                        ll h2 = max((ll)(b-pref2[k]),(ll)0);
                        ll h3 = 0;
                        dp[a][b][c + 1][j] = min((ll) dp[a][b][c + 1][j], (ll) (dp[a][b][c][e] + h1 + h2 + h3));
                    }
                    j = 0;
                    if (a != v1) {
                        ll k = d1[a];
                        ll h1 = 0;
                        ll h2 = max((ll)(b-pref2[k]),(ll)0);
                        ll h3 = max((ll)(c-pref3[k]),(ll)0);
                        dp[a + 1][b][c][j] = min((ll) dp[a + 1][b][c][j], (ll) (dp[a][b][c][e] + h1 + h2 + h3));
                    }
                }
                {
                    ll e = 2;
                    ll j = 0;
                    if (a != v1) {
                        ll k = d1[a];
                        ll h1 = 0;
                        ll h2 = max((ll)(b-pref2[k]),(ll)0);
                        ll h3 = max((ll)(c-pref3[k]),(ll)0);
                        dp[a + 1][b][c][j] = min((ll) dp[a + 1][b][c][j], (ll) (dp[a][b][c][e] + h1 + h2 + h3));
                    }
                    j = 1;
                    if (b != v2) {
                        ll k = d2[b];
                        ll h1 = max((ll)(a-pref1[k]),(ll)0);
                        ll h2 = 0;
                        ll h3 = max((ll)(c-pref3[k]),(ll)0);
                        dp[a][b + 1][c][j] = min((ll) dp[a][b + 1][c][j], (ll) (dp[a][b][c][e] + h1 + h2 + h3));
                    }
                }
            }
        }
    }
    cout << min({dp[v1][v2][v3][(ll) 0], dp[v1][v2][v3][1], dp[v1][v2][v3][2]});
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...