Submission #1163326

#TimeUsernameProblemLanguageResultExecution timeMemory
1163326Math4Life2020Lamps (JOI19_lamps)C++20
10 / 100
259 ms58208 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using pii = pair<ll,ll>; const ll INF = 1e18; int main() { ios_base::sync_with_stdio(false); cin.tie(0); ll N; cin >> N; string A,B; cin >> A >> B; ll ans = 0; vector<bool> va,vb; va.push_back(0); vb.push_back(0); for (ll i=0;i<N;i++) { va.push_back(A[i]=='1'); vb.push_back(B[i]=='1'); } va.push_back(0); vb.push_back(0); set<ll> vda,vdb; for (ll i=0;i<(va.size()-1);i++) { if (va[i]^va[i+1]) { vda.insert(i); } if (vb[i]^vb[i+1]) { vdb.insert(i); } } vda.insert(-1); vdb.insert(-1); vda.insert(2000000); vdb.insert(2000000); vector<ll> vcom; for (ll x0: vda) { if (vdb.find(x0)!=vdb.end()) { vcom.push_back(x0); } } ll K = vcom.size(); ll dp[K]; //double the answer dp[0]=0; for (ll i=1;i<K;i++) { dp[i]=INF; } for (ll i=1;i<K;i++) { for (ll j=max(0LL,i-8);j<i;j++) { //cout << "i,j="<<i<<","<<j<<"\n"; vector<ll> vta,vtb; for (auto A0 = vda.upper_bound(vcom[j]);A0!=vda.end() && (*A0)<vcom[i];A0++) { vta.push_back((*A0)); } for (auto A0 = vdb.upper_bound(vcom[j]);A0!=vdb.end() && (*A0)<vcom[i];A0++) { vtb.push_back(*A0); } // for (ll x0: vta) { // cout << "vta: "<<x0 <<"\n"; // } // for (ll x0: vtb) { // cout << "vtb: "<<x0 <<"\n"; // } ll dpt = vtb.size()+(vta.size()%2); if (vta.size()<=1) { //cout << "set: "<<(dp[j]+dpt)<< "\n"; dp[i]=min(dp[i],dp[j]+dpt); continue; } dpt+=2; //cout << "set: "<<(dp[j]+dpt)<< "\n"; dp[i]=min(dp[i],dp[j]+dpt); if (vtb.size()==0) { continue; } ll amin = vtb[0]; ll amax = vtb[vtb.size()-1]; ll nbtw = 0; ll nlb = 0; ll nub = 0; for (ll x0: vta) { if (x0>=amin && x0<=amax) { nbtw++; } if (x0>=amin) { nlb++; } if (x0<=amax) { nub++; } } if ((nub == vta.size() || nlb == vta.size())&&vta.size()%2==1) { //cout << "f1\n"; //cout << "set: "<<(dp[j]+dpt-2)<< "\n"; dp[i]=min(dp[i],dp[j]+dpt-2); continue; } if ((nbtw == (vta.size()) && vta.size()%2==0) || (nbtw >= (vta.size()-1) && vta.size()%2==1)) { //cout << "f2\n"; //cout << "set: "<<(dp[j]+dpt-2)<< "\n"; dp[i]=min(dp[i],dp[j]+dpt-2); continue; } } } cout << (dp[K-1]/2); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...