Submission #921587

#TimeUsernameProblemLanguageResultExecution timeMemory
921587vjudge1Growing Vegetable is Fun 3 (JOI19_ho_t3)C++17
75 / 100
526 ms780748 KiB
    #include <bits/stdc++.h>
     
    using namespace std;
    
    #define lli long long int
    #define MP make_pair
    #define pb push_back
    #define REP(i,n) for(int (i) = 0; (i) < (n); (i)++)
     
    #pragma GCC optimize("O1,O2,O3,Ofast,unroll-loops")
     
    void fastio() {
        ios_base::sync_with_stdio(false);
        cin.tie(NULL);
    }
     
     
    const double EPS = 0.00001;
    const int INF = 1e9+500;
    const int N = 405;
    const int ALPH = 26;
    const int LGN = 25;
    const int MOD = 1e9+7;
    int n,m,q;
    int dp[N][N][N][3];
    vector<int> s;
    vector<int> p[3];
    int mxs[3];
    vector<int> plac[3]; // 1 - indexed
    void find_oth(int x, vector<int> &oth) {
        oth.clear();
        for(int i = 0; i<3; i++) {
            if(i == x) continue;
            oth.pb(i);
        }
        
    }
     
    void reset() {
        REP(i,N) REP(j,N) REP(k,N) REP(t,3) {
            dp[i][j][k][t] = INF;
        } 
    }
     
    inline void solve() {
        cin>>n;
        string tmp;
        cin>>tmp;
        s.assign(n+3, -1);
        for(int i = 0; i<n; i++) {
            if(tmp[i] == 'R') s[i + 1] = 0;
            if(tmp[i] == 'G') s[i + 1] = 1;
            if(tmp[i] == 'Y') s[i + 1] = 2;
     
        }
        reset();
        REP(i,3) {
            p[i].assign(n+2, 0);
            p[i][0] = 0;
            plac[i].pb(0);
            dp[0][0][0][i] = 0;
        }
        for(int i = 1; i<=n; i++) {
            plac[ s[i] ].pb(i);
        }
        for(int t = 0; t<3; t++) {
            for(int i = 1; i<=n; i++) {
                p[t][i] = p[t][i - 1] + (s[i] == t);
            }
            mxs[t] = p[t][n];
        }
     
        for(int i = 1; i<=n; i++) {
            array<int,3> cnt;
            for(cnt[0] = 0; cnt[0] <= mxs[0]; cnt[0]++) {
                for(cnt[1] = 0; cnt[1] <= mxs[1]; cnt[1]++) {
                    if(cnt[1] + cnt[0] > i) break;
                    cnt[2] = i - cnt[0] - cnt[1];
                    if(cnt[2] > mxs[2]) continue;
                    for(int cur = 0; cur<3; cur++) {
                        if(cnt[cur] == 0) continue;
                        int ind = plac[cur][cnt[cur]];
                        int bef = 0;
                        for(int t = 0; t<3; t++) {
                            bef += min(p[t][ind - 1], cnt[t] - (t == cur));    
                        }
                        int aft = i - 1 - bef;
                        int nwind = ind + aft;
                        int cost = nwind - i;
                        vector<int> lst;
                        find_oth(cur, lst);
                        int prcnt[3];
                        for(int t = 0; t<3; t++) {
                            prcnt[t] = cnt[t];
                            if(t == cur) prcnt[t]--;
                        }
                        for(auto el : lst) {
                            dp[i][cnt[0]][cnt[1]][cur] = min(dp[i][cnt[0]][cnt[1]][cur], cost + dp[i - 1][prcnt[0]][prcnt[1]][el]);
                        }
                    }
                }
            }
        }
     
        int ans = INF;
        for(int i = 0; i<3; i++) ans = min(dp[n][mxs[0]][mxs[1]][i], ans);
        if(ans == INF) ans = -1;
        cout<<ans<<"\n"; 
    }
     
    signed main() {
     
        fastio();
        int test = 1;
        //cin>>test;
        while(test--) {
            solve();
        }
        
    } 

Compilation message (stderr)

joi2019_ho_t3.cpp: In function 'void reset()':
joi2019_ho_t3.cpp:8:30: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    8 |     #define REP(i,n) for(int (i) = 0; (i) < (n); (i)++)
      |                              ^
joi2019_ho_t3.cpp:40:9: note: in expansion of macro 'REP'
   40 |         REP(i,N) REP(j,N) REP(k,N) REP(t,3) {
      |         ^~~
joi2019_ho_t3.cpp:8:30: warning: unnecessary parentheses in declaration of 'j' [-Wparentheses]
    8 |     #define REP(i,n) for(int (i) = 0; (i) < (n); (i)++)
      |                              ^
joi2019_ho_t3.cpp:40:18: note: in expansion of macro 'REP'
   40 |         REP(i,N) REP(j,N) REP(k,N) REP(t,3) {
      |                  ^~~
joi2019_ho_t3.cpp:8:30: warning: unnecessary parentheses in declaration of 'k' [-Wparentheses]
    8 |     #define REP(i,n) for(int (i) = 0; (i) < (n); (i)++)
      |                              ^
joi2019_ho_t3.cpp:40:27: note: in expansion of macro 'REP'
   40 |         REP(i,N) REP(j,N) REP(k,N) REP(t,3) {
      |                           ^~~
joi2019_ho_t3.cpp:8:30: warning: unnecessary parentheses in declaration of 't' [-Wparentheses]
    8 |     #define REP(i,n) for(int (i) = 0; (i) < (n); (i)++)
      |                              ^
joi2019_ho_t3.cpp:40:36: note: in expansion of macro 'REP'
   40 |         REP(i,N) REP(j,N) REP(k,N) REP(t,3) {
      |                                    ^~~
joi2019_ho_t3.cpp: In function 'void solve()':
joi2019_ho_t3.cpp:8:30: warning: unnecessary parentheses in declaration of 'i' [-Wparentheses]
    8 |     #define REP(i,n) for(int (i) = 0; (i) < (n); (i)++)
      |                              ^
joi2019_ho_t3.cpp:57:9: note: in expansion of macro 'REP'
   57 |         REP(i,3) {
      |         ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...