Submission #1308919

#TimeUsernameProblemLanguageResultExecution timeMemory
1308919wangzhiyi33Growing Vegetable is Fun 3 (JOI19_ho_t3)C++20
100 / 100
329 ms380952 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long 

const int inf=1e18;

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int n;
    cin>>n;
    string s;
    cin>>s;
    int totr=0,totg=0,toty=0;

    s="."+s;
    vector<int>mana[3];
    for(int q=1;q<=n;q++){
        if(s[q]=='R'){
            totr++;
            mana[0].push_back(q);
        }
        else if(s[q]=='Y'){
            toty++;
            mana[2].push_back(q);
        }
        else{
            totg++;
            mana[1].push_back(q);
        }
    }

    int dp[n+1][totr+1][totg+1][3];
    dp[0][0][0][0]=dp[0][0][0][1]=dp[0][0][0][2]=0;
    for(int q=1;q<=n;q++){
        for(int r=0;r<=totr;r++){
            for(int g=0;g<=totg;g++){
                dp[q][r][g][0]=inf;dp[q][r][g][1]=inf;dp[q][r][g][2]=inf;
                int y=q-r-g;
                if(y<0 || y>toty)continue;

                // cur=0
                int val=inf;
                if(r>0){
                    val=min(dp[q-1][r-1][g][2],dp[q-1][r-1][g][1]);

                    int pos=mana[0][r-1];
                    // cari yang green lebih dari posisi
                    int brp=lower_bound(mana[1].begin(),mana[1].end(),mana[0][r-1])-mana[1].begin();
                    pos+=max(0LL,g-brp);
                    // cari yellow
                    brp=lower_bound(mana[2].begin(),mana[2].end(),mana[0][r-1])-mana[2].begin();
                    pos+=max(0LL,y-brp);

                    //cout<<pos<<" "<<r<<" "<<g<<" "<<y<<endl;
                    val+=abs(pos-q);
                    dp[q][r][g][0]=min(inf,val);
                   // cout<<dp[q][r][g][0]<<endl;
                }

                // cur=1
                val=inf;
                if(g>0){
                    val=min(dp[q-1][r][g-1][2],dp[q-1][r][g-1][0]);
                    
                    int pos=mana[1][g-1];
                    // cari yang red lebih dari posisi
                    int brp=lower_bound(mana[0].begin(),mana[0].end(),mana[1][g-1])-mana[0].begin();
                    pos+=max(0LL,r-brp);
                    // cari yellow
                    brp=lower_bound(mana[2].begin(),mana[2].end(),mana[1][g-1])-mana[2].begin();
                    pos+=max(0LL,y-brp);

                    val+=abs(pos-q);
                    dp[q][r][g][1]=min(inf,val);
                }

                // cur=2
                val=inf;
                if(y>0){
                    val=min(dp[q-1][r][g][0],dp[q-1][r][g][1]);

                    int pos=mana[2][y-1];
                    // cari yang red lebih dari posisi
                    int brp=lower_bound(mana[0].begin(),mana[0].end(),mana[2][y-1])-mana[0].begin();
                    pos+=max(0LL,r-brp);
                    // cari green
                    brp=lower_bound(mana[1].begin(),mana[1].end(),mana[2][y-1])-mana[1].begin();
                    pos+=max(0LL,g-brp);

                    val+=abs(pos-q);
                    dp[q][r][g][2]=min(inf,val);
                }
            }
        }
    }

    int ans=min({dp[n][totr][totg][0],dp[n][totr][totg][1],dp[n][totr][totg][2]});
    if(ans==inf)ans=-1;
    cout<<ans<<endl;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...