Submission #1225583

#TimeUsernameProblemLanguageResultExecution timeMemory
1225583PagodePaivaMosaic (IOI24_mosaic)C++20
100 / 100
91 ms29248 KiB
#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 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...