Submission #259780

#TimeUsernameProblemLanguageResultExecution timeMemory
259780mkisicLamps (JOI19_lamps)C++14
47 / 100
248 ms262148 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef double lf; typedef long double Lf; typedef pair <int,int> pii; typedef pair <ll, ll> pll; #define TRACE(x) cerr << #x << " " << x << endl #define FOR(i, a, b) for (int i = (a); i < int(b); i++) #define REP(i, n) FOR(i, 0, n) #define all(x) (x).begin(), (x).end() #define _ << " " << #define fi first #define sec second #define mp make_pair #define pb push_back const int MAXN = 1000010; const int inf = 2000000; int n; char s[MAXN], p[MAXN]; int dp[MAXN][4][4][4]; vector <pair <lf, int> > tmp; void normal(vector <lf> &v) { tmp.clear(); REP(i, 3) tmp.pb({v[i], i}); sort(all(tmp)); int cnt = 1; REP(i, 3) { if (tmp[i].fi) v[tmp[i].sec] = cnt++; } } int rek(int i, vector <lf> v) { normal(v); int a = v[0], b = v[1], c = v[2]; if (i == n + 1) return 0; if (dp[i][a][b][c] != -1) return dp[i][a][b][c]; int ret = inf; int t = s[i]; if (b && b > c && b > a) t = 0; if (c && c > b && c > a) t = 1; if (a && a > b && a > c) { if (b && b > c) t = 1; if (c && c > b) t = 0; if (!b && !c) t = s[i] ^ 1; } if (a && b && c && t != p[i]) return dp[i][a][b][c] = inf; if (!a) { for (lf x = 0.5; x <= 3; x += 0.5) { ret = min(ret, rek(i, {x, b, c}) + 1); } } if (!b) { for (lf x = 0.5; x <= 3; x += 0.5) { ret = min(ret, rek(i, {a, x, c}) + 1); } } if (!c) { for (lf x = 0.5; x <= 3; x += 0.5) { ret = min(ret, rek(i, {a, b, x}) + 1); } } if (t == p[i]) { ret = min(ret, rek(i + 1, {a, b, c})); ret = min(ret, rek(i + 1, {0, b, c})); ret = min(ret, rek(i + 1, {0, 0, c})); ret = min(ret, rek(i + 1, {0, 0, 0})); ret = min(ret, rek(i + 1, {a, 0, c})); ret = min(ret, rek(i + 1, {a, b, 0})); ret = min(ret, rek(i + 1, {a, 0, 0})); ret = min(ret, rek(i + 1, {0, b, 0})); } return dp[i][a][b][c] = ret; } int main() { cin >> n; cin >> s >> p; REP(i, n) { s[i] -= '0'; p[i] -= '0'; } for (int i = n; i > 0; i--) { s[i] = s[i - 1]; p[i] = p[i - 1]; } memset(dp, -1, sizeof dp); cout << rek(1, {0, 0, 0}) << endl; //FOR(i, 1, n + 1) TRACE(i _ rek(i, {0, 0, 0})); return 0; }

Compilation message (stderr)

lamp.cpp: In function 'int rek(int, std::vector<double>)':
lamp.cpp:64:38: warning: narrowing conversion of 'b' from 'int' to 'double' inside { } [-Wnarrowing]
       ret = min(ret, rek(i, {x, b, c}) + 1);
                                      ^
lamp.cpp:64:38: warning: narrowing conversion of 'b' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:64:38: warning: narrowing conversion of 'c' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:64:38: warning: narrowing conversion of 'c' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:69:38: warning: narrowing conversion of 'a' from 'int' to 'double' inside { } [-Wnarrowing]
       ret = min(ret, rek(i, {a, x, c}) + 1);
                                      ^
lamp.cpp:69:38: warning: narrowing conversion of 'a' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:69:38: warning: narrowing conversion of 'c' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:69:38: warning: narrowing conversion of 'c' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:74:38: warning: narrowing conversion of 'a' from 'int' to 'double' inside { } [-Wnarrowing]
       ret = min(ret, rek(i, {a, b, x}) + 1);
                                      ^
lamp.cpp:74:38: warning: narrowing conversion of 'a' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:74:38: warning: narrowing conversion of 'b' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:74:38: warning: narrowing conversion of 'b' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:79:40: warning: narrowing conversion of 'a' from 'int' to 'double' inside { } [-Wnarrowing]
     ret = min(ret, rek(i + 1, {a, b, c}));
                                        ^
lamp.cpp:79:40: warning: narrowing conversion of 'a' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:79:40: warning: narrowing conversion of 'b' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:79:40: warning: narrowing conversion of 'b' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:79:40: warning: narrowing conversion of 'c' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:79:40: warning: narrowing conversion of 'c' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:80:40: warning: narrowing conversion of 'b' from 'int' to 'double' inside { } [-Wnarrowing]
     ret = min(ret, rek(i + 1, {0, b, c}));
                                        ^
lamp.cpp:80:40: warning: narrowing conversion of 'b' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:80:40: warning: narrowing conversion of 'c' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:80:40: warning: narrowing conversion of 'c' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:81:40: warning: narrowing conversion of 'c' from 'int' to 'double' inside { } [-Wnarrowing]
     ret = min(ret, rek(i + 1, {0, 0, c}));
                                        ^
lamp.cpp:81:40: warning: narrowing conversion of 'c' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:83:40: warning: narrowing conversion of 'a' from 'int' to 'double' inside { } [-Wnarrowing]
     ret = min(ret, rek(i + 1, {a, 0, c}));
                                        ^
lamp.cpp:83:40: warning: narrowing conversion of 'a' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:83:40: warning: narrowing conversion of 'c' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:83:40: warning: narrowing conversion of 'c' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:84:40: warning: narrowing conversion of 'a' from 'int' to 'double' inside { } [-Wnarrowing]
     ret = min(ret, rek(i + 1, {a, b, 0}));
                                        ^
lamp.cpp:84:40: warning: narrowing conversion of 'a' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:84:40: warning: narrowing conversion of 'b' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:84:40: warning: narrowing conversion of 'b' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:85:40: warning: narrowing conversion of 'a' from 'int' to 'double' inside { } [-Wnarrowing]
     ret = min(ret, rek(i + 1, {a, 0, 0}));
                                        ^
lamp.cpp:85:40: warning: narrowing conversion of 'a' from 'int' to 'double' inside { } [-Wnarrowing]
lamp.cpp:86:40: warning: narrowing conversion of 'b' from 'int' to 'double' inside { } [-Wnarrowing]
     ret = min(ret, rek(i + 1, {0, b, 0}));
                                        ^
lamp.cpp:86:40: warning: narrowing conversion of 'b' from 'int' to 'double' inside { } [-Wnarrowing]
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...