# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1217898 | dosts | Mosaic (IOI24_mosaic) | C++20 | 0 ms | 0 KiB |
#include "mosaic.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2")
#define int long long
#define pii pair<int,int>
#define vi vector<int>
#define ff first
#define ss second
#define sp << " " <<
#define all(x) x.begin(),x.end()
#define big(x) ((int)(x.size()))
using namespace std;
const int MOD = 1e9+7, LIM = 1e6+1, inf = 2e9;
int rectsum(int x1,int y1,int x2,int y2) {
return grid[x2][y2]-grid[x1-1][y2]-grid[x2][y1-1]+grid[x1-1][y1-1];
};
vi mosaic(vector<int32_t> X, vector<int32_t> Y,
vector<int32_t> T, vector<int32_t> B,
vector<int32_t> L, vector<int32_t> R) {
int N = X.size(),Q = T.size();
int rows[4][N+1],cols[4][N+1];
for (int i = 1;i<=N;i++) rows[1][i] = X[i-1];
for (int i = 1;i<=N;i++) cols[i][1] = Y[i-1];
rows[2][1] = Y[1],rows[3][1] = Y[2];
set<int> diag;
for (int i = 2;i<=3;i++) {
for (int j = 2;j<=N;j++) {
rows[i][j] = (!rows[i-1][j] && !rows[i][j-1]);
if (rows[i][j]) diag.insert(i-j);
}
}
cols[2][1] = X[1],cols[3][1] = X[2];
for (int i = 2;i<=3;i++) {
for (int j = 2;j<=N;j++) {
cols[i][j] = (!cols[i-1][j] && !cols[i][j-1]);
if (cols[i][j]) diag.insert(i-j);
}
}
int prv = cols[3][4];
for (int i = 4;i<=4;i++) {
for (int j = 4;j<=N;j++) {
prv = (!rows[3][j] && !prv);
if (prv) diag.insert(i-j);
}
}
vi ans(Q,0);
for (int i = 0;i<Q;i++) {
L[i]++,R[i]++,T[i]++,B[i]++;
if (L[i] <= 3) {
ans[i] = cols[L[i]][T[i]];
continue;
}
if (T[i] <= 3) {
ans[i] = rows[T[i]][L[i]];
continue;
}
ans[i] = diag.count(T[i]-L[i]);
}
return ans;
}