Submission #1245482

#TimeUsernameProblemLanguageResultExecution timeMemory
1245482Hamed_GhaffariMosaic (IOI24_mosaic)C++20
20 / 100
89 ms29256 KiB
#include "mosaic.h" #include <bits/stdc++.h> using namespace std; using ll = long long; const int MXN = 4e5+5; ll ps[MXN], ps2[MXN], ps3[MXN], psx[MXN], psx1[MXN], psy[MXN], rem[MXN]; int a[3][MXN]; vector<ll> mosaic(vector<int> X, vector<int> Y, vector<int> T, vector<int> B, vector<int> L, vector<int> R) { int n = X.size(), q = L.size(); for(int i=0; i<n; i++) { a[0][i] = X[i]; if(i<3) a[i][0] = Y[i]; } psx[1] = X[0]; for(int i=2; i<=n; i++) psx[i] = psx[i-1] + X[i-1]; psy[1] = Y[0]; for(int i=2; i<=n; i++) psy[i] = psy[i-1] + Y[i-1]; if(n>=2) { for(int i=1; i<n; i++) a[1][i] = !(a[1][i-1]|a[0][i]); psx1[1] = a[1][0]; for(int i=2; i<=n; i++) psx1[i] = psx1[i-1] + a[1][i-1]; } int fir=-1; if(n>=3) { for(int i=1; i<n; i++) { a[2][i] = !(a[2][i-1]|a[1][i]); if(a[2][i]) { ps[i-2+n]++; if(fir==-1) fir = i; } } } for(int i=3; i<n; i++) { if(fir!=1) { if(Y[i]==0) ps[1-i+n]++, fir=0; else if(fir!=2) ps[2-i+n]++, rem[i]++, fir=1; } fir++; } for(int i=1; i<n; i++) rem[i] += rem[i-1]; // for(int i=1; i<=2*n-1; i++) { // cout << ps[i] << ' '; // } // cout << '\n'; for(int i=1; i<=2*n-1; i++) { ps2[i] = ps2[i-1] + ps[i]*i; ps3[i] = ps3[i-1] + ps[i]*(2*n-i); ps[i] += ps[i-1]; } vector<ll> ans(q, 0); for(int i=0; i<q; i++) { if(L[i]==0) { ans[i] += psy[B[i]+1] - psy[T[i]]; if(R[i]==0) continue; L[i]++; } if(T[i]==0) { ans[i] += psx[R[i]+1] - psx[L[i]]; if(B[i]==0) continue; T[i]++; } if(T[i]==1) { ans[i] += psx1[R[i]+1] - psx1[L[i]]; if(B[i]==1) continue; T[i]++; } if(L[i]==1) ans[i] -= rem[B[i]] - rem[T[i]-1]; // cout << T[i] << ' ' << B[i] << ' ' << L[i] << ' ' << R[i] << '\n'; int mn = L[i]-B[i]+n, mx = R[i]-T[i]+n, len = min(B[i]-T[i], R[i]-L[i])+1; // cout << mn << ' ' << mx << ' ' << len << '\n'; // cout << mx-len+1 << ' ' << mn+len-2 << '\n'; // cout << ps[mx-len+1] << ' ' << ps[mn+len-2] << '\n'; ans[i] += (ps2[mn+len-2]-ps2[mn-1])-(mn-1)*(ps[mn+len-2]-ps[mn-1]) + (ps3[mx]-ps3[mx-len+1])-(2*n-1-mx)*(ps[mx]-ps[mx-len+1]) + len*(ps[mx-len+1]-ps[mn+len-2]); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...