Submission #204243

#TimeUsernameProblemLanguageResultExecution timeMemory
204243bashGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++17
100 / 100
181 ms197240 KiB
/** SXR0aXAkI0JwbXptI3FhI3Z3I293bCNqY2IjUG0jMCNicG0jVHFkcXZvLyNCcG0jQW10bjBhY2phcWFicXZvLyNNYm16dml0MSNWdyNhdGN1am16I2tpdiNhbXF9bSNQcXUjVnd6I0F0bW14MSNQcWEjaXptI2l0dCNicHF2b2EjUXYjYnBtI3BtaWRtdmEjaXZsI3d2I21pemJwMSNFcHcjcWEjYnBtem0ja2l2I3F2Ym16a21sbSNRdiNQcWEjeHptYW12a20jbXtrbXhiI0lhI3BtI3htenVxYmJtYnBHI1BtI3N2d2VtYnAjRXBpYiMraXh4bWl6bWJwI2J3I1BxYSNrem1pYmN6bWEjSWEsI0ptbnd6bSN3eiNJbmJteiN3eiNKbXBxdmwjYnBtdTEjVnd6I2FwaXR0I2JwbXwja3d1eGlhYSNJY29wYiN3biNwcWEjc3Z3ZXRtbG9tI017a214YiNpYSNQbSNlcXR0bWJwMSNQcWEjYnB6d3ZtI2x3YnAjbXtibXZsI1dkbXojYnBtI3BtaWRtdmEjSXZsI3d2I21pemJwLyNpdmwjUG0jbm1tdG1icCNWdyNuaWJxb2NtI3F2I29jaXpscXZvI0l2bCN4em1hbXpkcXZvI2JwbXUvI053eiNQbSNxYSNicG0jVXdhYiNQcW9wMSNCcG0jQWN4em11bSMrcXYjb3R3enwsMQ== */ #include <cstring> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <stack> #include <bitset> #include <algorithm> #include <functional> #include <numeric> #include <utility> #include <sstream> #include <iostream> #include <iomanip> #include <cstdio> #include <queue> #include <cmath> #include <cstdlib> #include <ctime> #include <cassert> #define F first #define S second #define endl '\n' #define deb(x) cout<<#x<<' '<<x<<endl; #define pb push_back using namespace __gnu_pbds; using namespace std; typedef tree< int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; /* #ifdef IZI_KATKA #define int __int64_t #else #define int __int64 #endif */ const long long MOD = 1e9 + 7; const long long MAXN = 1e6 + 1; typedef long long ll; #define pii pair<int,int> long long readInt() { bool minus1 = false; long long result = 0; char ch; ch = getchar(); while (true) { if (ch == '-') break; if (ch >= '0' && ch <= '9') break; ch = getchar(); } if (ch == '-') minus1 = true; else result = ch-'0'; while (true) { ch = getchar(); if (ch < '0' || ch > '9') break; result = result*10 + (ch - '0'); } if (minus1) return -result; else return result; } const int maxn = 411; int a[maxn]; int dp[3][maxn][maxn][maxn]; int pref[3][maxn]; int qtd[maxn]; int pos[3][maxn]; int n; int main() { #ifdef IZI_KATKA assert(freopen("input", "r", stdin)); assert(freopen("output", "w", stdout)); #endif int n = readInt(); string s; cin >> s; for (int i = 0; i < s.size(); i++) { if (s[i] == 'R') { a[i + 1] = 0; qtd[0]++; pos[0][qtd[0]] = i + 1; } else if (s[i] == 'G') { a[i + 1] = 1; qtd[1] ++; pos[1][qtd[1]] = i + 1; } else if (s[i] == 'Y') { a[i + 1] = 2; qtd[2] ++; pos[2][qtd[2]] = i + 1; } } for (int t = 0; t < 3; t++) { for (int i = 1; i <= n; i++) { pref[t][i] = pref[t][i - 1]; if (a[i] == t) { pref[t][i]++; } } } for (int i = 0; i < 3; i++) { for (int r = 0; r <= qtd[0]; r++) { for (int g = 0; g <= qtd[1]; g++) { for (int y = 0; y <= qtd[2]; y++) { dp[i][r][g][y] = MOD; } } } } for (int i = 0; i < 3; i++) { dp[i][0][0][0] = 0; } for (int r = 0; r <= qtd[0]; r++) { for (int g = 0; g <= qtd[1]; g++) { for (int y = 0; y <= qtd[2]; y++) { for (int pre = 0; pre < 3; pre++) { for (int at = 0; at < 3; at++) { if (at == pre) continue; if ((at == 0 && r == qtd[0]) || (at == 1 && g == qtd[1]) || (at == 2 && qtd[2] == y)) continue; int ans = 0; int p1, p2, p3, dif; /// p1 = pos of previous /// p2 = pos of current /// p3 = pos of other /// dif = color of other dif = 3 - (pre + at); if (pre == 0) { p1 = pos[0][r]; if (at == 1) { p2 = pos[1][g + 1], p3 = pos[dif][y]; } else { p2 = pos[2][y + 1], p3 = pos[dif][g]; } } else if (pre == 1) { p1 = pos[1][g]; if (at == 0) { p2 = pos[0][r + 1], p3 = pos[dif][y]; } else { p2 = pos[2][y + 1], p3 = pos[dif][r]; } } else if (pre == 2) { p1 = pos[2][y]; if (at == 0) { p2 = pos[0][r + 1], p3 = pos[dif][g]; } else { p2 = pos[1][g + 1], p3 = pos[dif][r]; } } ans += max(0, pref[pre][p2]-pref[pre][p1]); ans += max(0, pref[dif][p2]-pref[dif][p3]); ans += dp[pre][r][g][y]; if (at == 0) dp[at][r+1][g][y] = min(dp[at][r+1][g][y], ans); else if (at == 1) dp[at][r][g+1][y] = min(dp[at][r][g+1][y], ans); else dp[at][r][g][y+1] = min(dp[at][r][g][y+1], ans); } } } } } int ans = MOD; for (int i = 0; i < 3; i++) { ans = min(ans, dp[i][qtd[0]][qtd[1]][qtd[2]]); } if (ans == MOD) { cout << -1; } else { cout << ans; } return 0; }

Compilation message (stderr)

joi2019_ho_t3.cpp: In function 'int main()':
joi2019_ho_t3.cpp:98:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i = 0; i < s.size(); i++) {
                  ~~^~~~~~~~~~
joi2019_ho_t3.cpp:170:47: warning: 'p3' may be used uninitialized in this function [-Wmaybe-uninitialized]
       ans += max(0, pref[dif][p2]-pref[dif][p3]);
                                   ~~~~~~~~~~~~^
joi2019_ho_t3.cpp:170:33: warning: 'p2' may be used uninitialized in this function [-Wmaybe-uninitialized]
       ans += max(0, pref[dif][p2]-pref[dif][p3]);
                     ~~~~~~~~~~~~^
joi2019_ho_t3.cpp:169:47: warning: 'p1' may be used uninitialized in this function [-Wmaybe-uninitialized]
       ans += max(0, pref[pre][p2]-pref[pre][p1]);
                                   ~~~~~~~~~~~~^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...