Submission #261246

#TimeUsernameProblemLanguageResultExecution timeMemory
261246mjkocijanLamps (JOI19_lamps)C++14
4 / 100
51 ms43128 KiB
#include <bits/stdc++.h> using namespace std; #define X first #define Y second #define pb push_back typedef long long ll; typedef pair<ll, ll> ii; #define MAXN 1001001 int n, reza = 0, reza2 = 0; char a[MAXN], b[MAXN]; int fl[MAXN], t0[MAXN], t1[MAXN], fif[MAXN], fib[MAXN], cf[MAXN], c0[MAXN], c1[MAXN], cfr[MAXN]; int alt_reza = 0; int gotu[MAXN]; int main() { memset(gotu, -1, sizeof gotu); scanf("%d", &n); scanf("%s", a); scanf("%s", b); for (int i = 0; i < n; i++) { fl[i] = a[i] != b[i]; t0[i] = b[i] == '0'; t1[i] = b[i] == '1'; } for (int i = 0; i < n; i++) { if (i == 0) { fif[i] = 0; fib[i] = 0; } else { if (fl[i]) fif[i] = fl[i - 1] ? fif[i - 1] : i; fib[i] = t0[i - 1] == t0[i] ? fib[i - 1] : i; cf[i] = cf[i - 1]; c0[i] = c0[i - 1]; c1[i] = c1[i - 1]; } if ((i == n - 1 && fl[i]) || (i < n - 1 && fl[i] && !fl[i + 1])) { cf[i]++; } if (i == n - 1 || (i < n - 1 && t0[i] && !t0[i + 1])) { c0[i]++; alt_reza++; } if (i == n - 1 || (i < n - 1 && t1[i] && !t1[i + 1])) { c1[i]++; if (i < n - 1) alt_reza++; } //cout << i<<": "<<fl[i]<<' '<<t0[i]<<' '<<t1[i]<<' '<<fif[i]<<' '<<fib[i]<<' '<<cf[i]<<' '<<c0[i]<<' '<<c1[i]<<endl; } for (int i = n - 1; i >= 0; i--) { if (i < n - 1) { cfr[i] = cfr[i + 1]; } if (!i || (i && fl[i] && !fl[i - 1])) { cfr[i]++; } } /*for (int i = 0; i < n; i++) { if (i < n - 1 && fl[i] == fl[i + 1]) continue; if (!fl[i]) continue; reza++;//cout<<i<<' '; }//cout<<endl; int i2 = 0, i3 = 0; for (; i2 < n; i2++) { if (t0[i2]) break; } for (; i3 < n; i3++) { if (t1[i3]) break; } if (max(i2 - 1, i3 - 1) >= 0) reza -= max(0, cf[max(i2 - 1, i3 - 1)] - 1);//printf("%d\n", reza); i2 = n - 1; i3 = n - 1; for (; i2 >= 0; i2--) { if (t0[i2]) break; } for (; i3 >= 0; i3--) { if (t1[i3]) break; } if (min(i2 + 1, i3 + 1) < n && i2 >= 0 && i3 >= 0) reza -= max(0, cfr[min(i2 + 1, i3 + 1)] - 1);//printf("%d\n", reza); for (int i = 0; i < n; i++) { if (!t1[i] || (i < n - 1 && t1[i + 1])) continue; if (i == n - 1 || fib[i] == 0) continue; int ccc = fl[fib[i]]; if (fl[fib[i] - 1] && fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - ccc);//cout<<i<<'.'<<reza<<' '<<fib[i]<<' '<<fl[fib[i]-1]<<' '<<cf[i]<<' '<<cf[fib[i]-1]<<' '<<ccc<<endl; if (!fl[fib[i] - 1] && fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - 1);//cout<<i<<'.'<<reza<<endl; if (fl[fib[i] - 1] && !fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - ccc - 1);//cout<<i<<'.'<<reza<<endl; if (!fl[fib[i] - 1] && !fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - 1);//cout<<i<<'.'<<reza<<endl; }printf("%d\n", reza); for (int i = 0; i < n; i++) { if (!t0[i] || (i < n - 1 && t0[i + 1])) continue; if (i == n - 1 || fib[i] == 0) continue; int ccc = fl[fib[i]]; if (fl[fib[i] - 1] && fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - ccc); if (!fl[fib[i] - 1] && fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - 1); if (fl[fib[i] - 1] && !fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - ccc - 1); if (!fl[fib[i] - 1] && !fl[i + 1]) reza -= max(0, cf[i] - cf[fib[i] - 1] - 1); }*/ for (int i = 0; i < n; i++) { if (i < n - 1 && t0[i] == t0[i + 1]) continue; if (cf[i] != cf[fib[i]] && cfr[i] != cfr[fib[i]]) { gotu[fib[i]] = i;//cout<<i<<' '<<fib[i]<<" . "<<cf[i]<<' '<<cf[fib[i]]<<endl; reza2++; //for (int j = fib[i]; j <= i; j++) { // //} } } for (int i = 0; i < n; i++) { if (gotu[i] > -1) { i = gotu[i]; continue; } if (i < n - 1 && fl[i] == fl[i + 1]) continue; if (!fl[i]) continue; if (i < n - 1 && gotu[i + 1] > -1) continue; reza++; //cout<<i<<' '; } //reza = min(reza, alt_reza); printf("%d\n", reza + reza2); return 0; }

Compilation message (stderr)

lamp.cpp: In function 'int main()':
lamp.cpp:19:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
lamp.cpp:20:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%s", a);
  ~~~~~^~~~~~~~~
lamp.cpp:21:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%s", b);
  ~~~~~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...