Submission #1160314

#TimeUsernameProblemLanguageResultExecution timeMemory
1160314SmuggingSpunMosaic (IOI24_mosaic)C++20
37 / 100
216 ms106496 KiB
#include<bits/stdc++.h> #include "mosaic.h" using namespace std; typedef long long ll; vector<ll>mosaic(vector<int>X, vector<int>Y, vector<int>T, vector<int>B, vector<int>L, vector<int>R){ int n = X.size(), q = T.size(); vector<ll>ans(q); if(n <= 5000){ vector<vector<int>>f(n + 1, vector<int>(n + 1, 0)); for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ if(i == 1){ f[i][j] = X[j - 1]; } else if(j == 1){ f[i][j] = Y[i - 1]; } else{ f[i][j] = (f[i][j - 1] | f[i - 1][j]) ^ 1; } } } for(int i = 1; i <= n; i++){ for(int j = 1; j <= n; j++){ f[i][j] += f[i][j - 1] + f[i - 1][j] - f[i - 1][j - 1]; } } for(int i = 0; i < q; i++){ ans[i] = f[B[i] + 1][R[i] + 1] - f[B[i] + 1][L[i]] - f[T[i]][R[i] + 1] + f[T[i]][L[i]]; } } else if(*max_element(B.begin(), B.end()) == 0){ for(int i = 1; i < n; i++){ X[i] += X[i - 1]; } for(int i = 0; i < q; i++){ ans[i] = X[R[i]] - (L[i] == 0 ? 0 : X[L[i] - 1]); } } else if(*max_element(X.begin(), X.end()) == 0 && *max_element(Y.begin(), Y.end()) == 0){ auto get = [&] (int u, int v){ return u == -1 || v == -1 ? 0 : 1LL * ((u + 1) >> 1) * ((v + 1) >> 1) + 1LL * (u >> 1) * (v >> 1); }; for(int i = 0; i < q; i++){ ans[i] = get(B[i], R[i]) - get(T[i] - 1, R[i]) - get(B[i], L[i] - 1) + get(T[i] - 1, L[i] - 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...