Submission #1282545

#TimeUsernameProblemLanguageResultExecution timeMemory
1282545WH8Growing Vegetable is Fun 3 (JOI19_ho_t3)C++20
100 / 100
143 ms58592 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long 
#define pll pair<int, int>
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define endl '\n'
#define ld long double

void chmin(int & x, int v){
	x=min(x, v);
}	

signed main(){
	int n;cin>>n;
	vector<int> v(n+1);
	vector<vector<int>> pos(3);
	for(int i=0;i<3;i++)pos[i].pb(0);
	vector<vector<int>> ps(3, vector<int>(n+1, 0));
	for(int i=1;i<=n;i++){
		char c;cin>>c;
		if(c=='R')v[i]=0;
		else if(c=='Y')v[i]=1;
		else v[i]=2;
		for(int j=0;j<3;j++)ps[j][i]=ps[j][i-1];
		ps[v[i]][i]++;
		pos[v[i]].pb(i);
	}
	//~ for(int i=0;i<3;i++){
		//~ printf("size of pos %lld is %lld\n", i, pos[i].size());
		//~ for(auto it:pos[i])cout<<it<<" ";
		//~ cout<<endl;
	//~ }
	
	int dp[pos[0].size()+1][pos[1].size()+1][pos[2].size()+1][3];
	for(int i=0;i<=(int)pos[0].size();i++)
		for(int j=0;j<=(int)pos[1].size();j++)
			for(int k=0;k<=(int)pos[2].size();k++)
				for(int z=0;z<3;z++)
					dp[i][j][k][z]=1e9;
	dp[0][0][0][0]=dp[0][0][0][1]=dp[0][0][0][2]=0;
	array<int, 3> p={0,0,0};
	for(p[0]=0;p[0]<(int)pos[0].size();p[0]++){
		for(p[1]=0;p[1]<(int)pos[1].size();p[1]++){
			for(p[2]=0;p[2]<(int)pos[2].size();p[2]++){
				for(int z=0;z<3;z++){
					//~ printf("%lld %lld %lld %lld\n",p[0],p[1],p[2],z);
					for(int cnt=1;cnt<=2;cnt++){
						int curval=dp[p[0]][p[1]][p[2]][z];
						int to=(z+cnt)%3, a=(to+1)%3,b=(to+2)%3;
						if(p[to]==(int)pos[to].size()-1)continue;
						
						p[to]++;
						int d=max(0ll, ps[a][pos[to][p[to]]]-p[a])
							+ max(0ll, ps[b][pos[to][p[to]]]-p[b]);
						chmin(dp[p[0]][p[1]][p[2]][to],curval+d);
						//~ printf("upd %lld %lld %lld %lld with value %lld\n", p[0],p[1],p[2],to,curval+d);
						p[to]--;
					}
				}
			}
		}
	}
	int ans=1e9;
	for(int i=0;i<3;i++)ans=min(ans,
		dp[pos[0].size()-1][pos[1].size()-1][pos[2].size()-1][i]);
	if(ans >= 1e9)cout<<-1;
	else cout<<ans;
	
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...