Submission #1010230

#TimeUsernameProblemLanguageResultExecution timeMemory
1010230ivan_alexeevGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++17
100 / 100
198 ms29836 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> using namespace std; using namespace __gnu_pbds; #define ordered_set tree<int, null_type, less<int>, rb_tree_tag,tree_order_statistics_node_update> /* #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #pragma GCC target("avx,avx2,bmi2,fma,popcnt") */ #ifdef lisie_bimbi #define debug(x) cout << #x << " : " << x << endl; #else #define debug(x) ; #define endl '\n' #endif //#define int long long #define inf 1000000000 #define double long double typedef long long ll; struct yeei{ int r; int g; int y; }; signed main(){ #ifdef lisie_bimbi freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #else ios_base::sync_with_stdio(false); cin.tie(nullptr); #endif int n; cin >> n; string s; cin >> s; int r = 0, g = 0, y = 0; vector<int> vr, vg, vy; for(int i = 0; i < n; i++){ if(s[i] == 'R'){ r++; vr.push_back(i); }else if(s[i] == 'G'){ g++; vg.push_back(i); }else{ y++; vy.push_back(i); } } vector<vector<vector<yeei>>> dp(r + 1, vector<vector<yeei>>(g + 1, vector<yeei>(y + 1, {inf, inf, inf}))); dp[0][0][0] = {0, 0, 0}; for(int r1 = 0; r1 <= r; r1++){ for(int g1 = 0; g1 <= g; g1++){ for(int y1 = 0; y1 <= y; y1++){ if((r1 == 0) && (g1 == 0) && (y1 == 0)){ continue; } if(r1 != 0){ int x = vr[r1 - 1]; int cnt = g1 + y1; cnt -= min(g1, (int)(std::lower_bound(vg.begin(), vg.end(), x) - vg.begin())); cnt -= min(y1, (int)(std::lower_bound(vy.begin(), vy.end(), x) - vy.begin())); dp[r1][g1][y1].r = min(dp[r1][g1][y1].r, dp[r1 - 1][g1][y1].g + cnt); dp[r1][g1][y1].r = min(dp[r1][g1][y1].r, dp[r1 - 1][g1][y1].y + cnt); } if(g1 != 0){ int x = vg[g1 - 1]; int cnt = r1 + y1; cnt -= min(r1, (int)(std::lower_bound(vr.begin(), vr.end(), x) - vr.begin())); cnt -= min(y1, (int)(std::lower_bound(vy.begin(), vy.end(), x) - vy.begin())); dp[r1][g1][y1].g = min(dp[r1][g1][y1].g, dp[r1][g1 - 1][y1].r + cnt); dp[r1][g1][y1].g = min(dp[r1][g1][y1].g, dp[r1][g1 - 1][y1].y + cnt); } if(y1 != 0){ int x = vy[y1 - 1]; int cnt = g1 + r1; cnt -= min(g1, (int)(std::lower_bound(vg.begin(), vg.end(), x) - vg.begin())); cnt -= min(r1, (int)(std::lower_bound(vr.begin(), vr.end(), x) - vr.begin())); dp[r1][g1][y1].y = min(dp[r1][g1][y1].y, dp[r1][g1][y1 - 1].g + cnt); dp[r1][g1][y1].y = min(dp[r1][g1][y1].y, dp[r1][g1][y1 - 1].r + cnt); } } } } int x = min(dp[r][g][y].r, min(dp[r][g][y].g, dp[r][g][y].y)); if(x < inf){ cout << x; }else{ cout << -1; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...