Submission #1248836

#TimeUsernameProblemLanguageResultExecution timeMemory
1248836qwerasdfzxclMosaic (IOI24_mosaic)C++20
100 / 100
153 ms58996 KiB
#include "mosaic.h" #include <bits/stdc++.h> using namespace std; using ll = long long; vector<ll> a[200200], b[200200]; ll c[2][200200], d[2][200200]; int n; ll calc(int x, int y){ if (x <= 3 || y <= 3) return b[x][y]; ll ret = b[x][3] + b[3][y] - b[3][3]; if (x <= y){ ret += d[1][x] - d[0][x] * (n+1-x); ret += c[1][y] - c[0][y] * (n+1-y); ret -= c[1][y-x+2] - c[0][y-x+2] * (n+1-y); // n+1 - (y-x+2) - (n+1-y) = x-2 ret += c[0][y-x+2] * (x-3); } else{ ret += c[1][y] - c[0][y] * (n+1-y); ret += d[1][x] - d[0][x] * (n+1-x); ret -= d[1][x-y+2] - d[0][x-y+2] * (n+1-x); /// n+1 - (x-y+2) - (n+1-x) = y-2 ret += d[0][x-y+2] * (y-3); } return ret; } std::vector<long long> mosaic(std::vector<int> X, std::vector<int> Y, std::vector<int> T, std::vector<int> B, std::vector<int> L, std::vector<int> R) { n = X.size(); a[0].resize(n+1); b[0].resize(n+1); for (int i=1;i<=n;i++) a[i].resize(4); for (int i=1;i<=3;i++) a[i].resize(n+1); for (int j=1;j<=n;j++) a[1][j] = X[j-1]; for (int i=1;i<=n;i++) a[i][1] = Y[i-1]; for (int i=2;i<=n;i++){ for (int j=2;j<(int)a[i].size();j++){ if (!a[i][j-1] && !a[i-1][j]) a[i][j] = 1; else a[i][j] = 0; } } for (int i=1;i<=n;i++){ b[i].resize(a[i].size()); for (int j=1;j<(int)a[i].size();j++) b[i][j] = a[i][j] + b[i-1][j] + b[i][j-1] - b[i-1][j-1]; } for (int j=3;j<=n;j++){ c[0][j] = c[0][j-1] + a[3][j]; c[1][j] = c[1][j-1] + a[3][j] * (n+1-j); } for (int i=4;i<=n;i++){ d[0][i] = d[0][i-1] + a[i][3]; d[1][i] = d[1][i-1] + a[i][3] * (n+1-i); } vector<ll> ans; for (int i=0;i<(int)T.size();i++){ int lx = T[i] + 1, rx = B[i] + 1; int ly = L[i] + 1, ry = R[i] + 1; ans.push_back(calc(rx, ry) - calc(lx-1, ry) - calc(rx, ly-1) + calc(lx-1, ly-1)); } 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...