Submission #1307976

#TimeUsernameProblemLanguageResultExecution timeMemory
1307976regulardude6모자이크 (IOI24_mosaic)C++20
100 / 100
89 ms27072 KiB
#include <bits/stdc++.h> using namespace std; vector<long long> mosaic(vector<int> X, vector<int> Y, vector<int> T, vector<int> B, vector<int> L, vector<int> R) { int N = (int)X.size(); int Q = (int)T.size(); vector<long long> result(Q); // Prefix sums for the first row and first column vector<long long> prefX(N + 1, 0), prefY(N + 1, 0); for (int i = 0; i < N; i++) { prefX[i + 1] = prefX[i] + X[i]; prefY[i + 1] = prefY[i] + Y[i]; } // Layer 1 sequences (row and column parts) int n1 = N >= 1 ? N - 1 : 0; vector<int> rowSeq1(n1, 0); vector<long long> prefixRow1(n1 + 1, 0); if (n1 > 0) { rowSeq1[0] = (X[1] == 0 && Y[1] == 0) ? 1 : 0; for (int k = 1; k < n1; k++) { rowSeq1[k] = (rowSeq1[k - 1] == 0 && X[k + 1] == 0) ? 1 : 0; } for (int i = 0; i < n1; i++) prefixRow1[i + 1] = prefixRow1[i] + rowSeq1[i]; } int n_c1 = N >= 2 ? N - 2 : 0; vector<int> colSeq1(n_c1, 0); vector<long long> prefixCol1(n_c1 + 1, 0); if (n_c1 > 0) { colSeq1[0] = (rowSeq1[0] == 0 && Y[2] == 0) ? 1 : 0; for (int k = 1; k < n_c1; k++) { colSeq1[k] = (colSeq1[k - 1] == 0 && Y[k + 2] == 0) ? 1 : 0; } for (int i = 0; i < n_c1; i++) prefixCol1[i + 1] = prefixCol1[i] + colSeq1[i]; } // Layer 2 sequences (row and column parts) int n2 = N >= 2 ? N - 2 : 0; vector<int> rowSeq2(n2, 0); vector<long long> prefixRow2(n2 + 1, 0), sumPrefixRow2(n2 + 2, 0); if (n2 > 0) { rowSeq2[0] = (rowSeq1[1] == 0 && colSeq1[0] == 0) ? 1 : 0; for (int k = 1; k < n2; k++) { rowSeq2[k] = (rowSeq1[k + 1] == 0 && rowSeq2[k - 1] == 0) ? 1 : 0; } for (int i = 0; i < n2; i++) { prefixRow2[i + 1] = prefixRow2[i] + rowSeq2[i]; } for (int i = 0; i <= n2; i++) { sumPrefixRow2[i + 1] = sumPrefixRow2[i] + prefixRow2[i]; } } int n3 = N >= 3 ? N - 3 : 0; vector<int> colSeq2(n3, 0); vector<long long> prefixCol2(n3 + 1, 0), sumPrefixCol2(n3 + 2, 0); if (n3 > 0) { colSeq2[0] = (rowSeq2[0] == 0 && colSeq1[1] == 0) ? 1 : 0; for (int k = 1; k < n3; k++) { colSeq2[k] = (colSeq2[k - 1] == 0 && colSeq1[k + 1] == 0) ? 1 : 0; } for (int i = 0; i < n3; i++) { prefixCol2[i + 1] = prefixCol2[i] + colSeq2[i]; } for (int i = 0; i <= n3; i++) { sumPrefixCol2[i + 1] = sumPrefixCol2[i] + prefixCol2[i]; } } for (int qi = 0; qi < Q; qi++) { int t = T[qi], b = B[qi], lq = L[qi], rq = R[qi]; long long total = 0; // Layer 0: row and column 0 if (t <= 0 && 0 <= b) { int sj = max(lq, 0), ej = rq; if (sj <= ej) total += prefX[ej + 1] - prefX[sj]; } if (lq <= 0 && 0 <= rq) { int si = max(t, 1), ei = b; if (si <= ei) total += prefY[ei + 1] - prefY[si]; } // Layer 1: row 1, col >=1 and col 1, row >=2 if (n1 > 0 && t <= 1 && 1 <= b && rq >= 1) { int ks = max(lq, 1) - 1; int ke = min(rq - 1, n1 - 1); if (ks <= ke) total += prefixRow1[ke + 1] - prefixRow1[ks]; } if (n_c1 > 0 && lq <= 1 && 1 <= rq && b >= 2) { int is_ = max(t, 2); int ie = b; int ks = is_ - 2; int ke = min(ie - 2, n_c1 - 1); if (ks <= ke) total += prefixCol1[ke + 1] - prefixCol1[ks]; } // Layers >=2: row parts if (n2 > 0 && rq >= 2 && b >= 2) { int ls = max(2, t), le = min(b, rq); if (ls <= le) { int i_start = rq - le + 1; int i_end = rq - ls + 1; long long sumEnd = sumPrefixRow2[i_end + 1] - sumPrefixRow2[i_start]; int leftEnd = min(le, lq); long long sumStart = 0; if (leftEnd >= ls) { int a = lq - leftEnd; int z = lq - ls; sumStart = sumPrefixRow2[z + 1] - sumPrefixRow2[a]; } total += sumEnd - sumStart; } } // Layers >=2: column parts if (n3 > 0 && rq >= 2 && b >= 3) { int ls = max(2, lq); int le = min(rq, b - 1); if (ls <= le) { int i_start = b - le; int i_end = b - ls; long long sumEnd = sumPrefixCol2[i_end + 1] - sumPrefixCol2[i_start]; int lowEnd = min(le, t - 1); long long sumStart = 0; if (lowEnd >= ls) { int a = t - lowEnd - 1; int z = t - ls - 1; if (z >= 0) { int A = max(0, a); sumStart = sumPrefixCol2[z + 1] - sumPrefixCol2[A]; } } total += sumEnd - sumStart; } } result[qi] = total; } return result; }
#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...