#include "mosaic.h"
#include<bits/stdc++.h>
using namespace std;
const int N = 200010;
int linha[3][N], coluna[N][3];
long long pref[N];
long long pref2[N];
long long pref_linha[3][N], pref_coluna[N][3];
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) {
int n = x.size();
vector <long long> ans;
for(int i = 0;i < n;i++){
linha[0][i] = x[i];
coluna[i][0] = y[i];
}
linha[1][0] = coluna[1][0];
linha[2][0] = coluna[2][0];
coluna[0][1] = linha[0][1];
coluna[0][2] = linha[0][2];
for(int i = 1;i < 3;i++){
for(int j = 1;j < n;j++){
if(linha[i][j-1] == 0 and linha[i-1][j] == 0)
linha[i][j] = 1;
else
linha[i][j] = 0;
if(coluna[j-1][i] == 0 and coluna[j][i-1] == 0)
coluna[j][i] = 1;
else
coluna[j][i] = 0;
}
}
for(int i = 0;i < 3;i++){
for(int j = 0;j < n;j++){
pref_linha[i][j] = (j-1 < 0 ? 0 : pref_linha[i][j-1]) + linha[i][j];
//cout << pref_linha[i][j] << ' ';
pref_coluna[j][i] = (j-1 < 0 ? 0 : pref_coluna[j-1][i]) + coluna[j][i];
}
//cout << '\n';
}
int C = n-3;
for(int i = n-1;i >= 2;i--){
pref[C-(i-2)] = (C - (i-2) -1 < 0 ? 0 : pref[C-(i-2)-1]) + coluna[i][2];
}
for(int i = 3;i < n;i++){
pref[C + (i-2)] = (C + (i-2) - 1 < 0 ? 0 : pref[C + (i-2) -1]) + linha[2][i];
}
pref2[0] = pref[0];
for(int i = 1;i < (n-2)+C;i++){
pref2[i] = pref2[i-1] + pref[i];
}
for(int i = 0;i < T.size();i++){
int l_linha = T[i], r_linha = B[i], l_coluna = L[i], r_coluna = R[i];
long long answer = 0;
while(l_linha < min(r_linha+1, 3)){
answer += pref_linha[l_linha][r_coluna] - (l_coluna == 0 ? 0 : pref_linha[l_linha][l_coluna-1]);
l_linha++;
}
if(l_linha > r_linha){
ans.push_back(answer);
continue;
}
while(l_coluna < min(r_coluna+1, 3)){
answer += pref_coluna[r_linha][l_coluna] - (l_linha == 0 ? 0 : pref_coluna[l_linha-1][l_coluna]);
l_coluna++;
}
if(l_coluna > r_coluna){
ans.push_back(answer);
continue;
}
// l_linha > 2, l_coluna > 2
answer += (r_coluna- l_linha + C < 0 ? 0 : pref2[r_coluna- l_linha + C]) - (r_coluna - r_linha + C - 1 < 0 ? 0 : pref2[r_coluna - r_linha + C - 1])
- ((l_coluna - l_linha + C - 1 < 0 ? 0 : pref2[l_coluna - l_linha + C - 1]) - (l_coluna - r_linha + C - 2 < 0 ? 0 : pref2[l_coluna - r_linha + C - 2]));
//answer += pref[r_coluna-l_linha+C] - (l_coluna - l_linha + C - 1 < 0 ? 0 : pref[l_coluna - l_linha + C - 1]);
ans.push_back(answer);
}
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |