Submission #1099877

#TimeUsernameProblemLanguageResultExecution timeMemory
1099877model_codeMosaic (IOI24_mosaic)C++17
100 / 100
513 ms150224 KiB
// correct/full.cpp #include "mosaic.h" #include "bits/stdc++.h" const int mxN = 1e6 + 5; using ll = long long; using namespace std; vector<long long> layers[3]; vector<long long> sum[3]; map<int, int> mp[mxN]; int N, Q; vector<ll> prefix, suffix; void genLayers() { for(int i = 0; i < 3; i++) { if(i!=0) { for(int j = i; j < N; j++) { mp[i][j] = 1 - (mp[i-1][j] | mp[i][j-1]); mp[j][i] = 1 - (mp[j-1][i] | mp[j][i-1]); } } for(int j = N - 1; j >= i; --j) layers[i].push_back(mp[j][i]); for(int j = i + 1; j < N; j++) layers[i].push_back(mp[i][j]); ///got my layer ///generate the sum sum[i] = layers[i]; for(int j = 1; j < layers[i].size(); j++) { sum[i][j] += sum[i][j-1]; } } prefix = layers[2]; suffix = layers[2]; reverse(suffix.begin(), suffix.end()); for(int i = 0; i < prefix.size(); i++) { prefix[i] *= i; if(i)prefix[i]+=prefix[i-1]; suffix[i] *= i; if(i)suffix[i]+=suffix[i-1]; } } int getLayerIndex(int x, int y) { int layer = min(x, y); if(y == layer) { return N - x - 1; } else { return (N - layer - 1) + (y - layer); } } int getSum(int lay, int l, int r) {return sum[lay][r]-sum[lay][l]+layers[lay][l];} ll calcPrefixProjection(int l, int r) { return prefix[r] - (l == 0 ? 0 : prefix[l-1]) - 1ll * getSum(2, l, r) * (l - 1); } ll calcSuffixProjection(int l, int r) { int orgL = l, orgR = r; tie(l, r) = make_pair(layers[2].size()-r-1,layers[2].size()-l-1); return suffix[r] - (l == 0 ? 0 : suffix[l-1]) - 1ll * getSum(2, orgL, orgR) * (l - 1); } 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) { N = X.size(); vector<int> layer(N * 2 - 1); for(int i = 0; i < N; i++) { mp[0][i] = X[i]; } for(int i = 0; i < N; i++) { mp[i][0] = Y[i]; } genLayers(); vector<long long> ans; auto tmpB = B; for(int i = 0; i < T.size(); i++) { ///Rows A to C ///Columns B to D int A = T[i], C = tmpB[i]; int B = L[i], D = R[i]; long long total = 0; for (int i = 0; i < 2; ++i) { if (A == i && B == i) { ///both row and column total += getSum(i, N - 1 - C, (N-1-i) + (D-i)); ++A, ++B; } else if (A == i) { ///only row total += getSum(i, N - 1 - i + (B-i), N - 1 - i + (D-i)); ++A; } else if (B == i) { ///only column total += getSum(i, N - 1 - C, N - 1 - A); ++B; } if (A > C || B > D) break; } if (A <= C && B <= D) { ///The submatrix is divided into 3 parts ///1. increasing prefix from 1 to x ///2. decreasing suffix from 1 to x ///3. constant shit int l, r, offset; { int x = C, y = B; int projDistance = min(x-2,y-2); int px = x - projDistance, py = y - projDistance; int prefixL = getLayerIndex(px, py); int prefixR = prefixL + min(C-A,D-B)-1; if(prefixL <= prefixR) { total += calcPrefixProjection(prefixL, prefixR); } l = prefixR + 1; offset = (prefixR-prefixL+2); } { int x = A, y = D; int projDistance = min(x-2,y-2); int px = x - projDistance, py = y - projDistance; int prefixR = getLayerIndex(px, py); int prefixL = prefixR - min(C-A,D-B) + 1; if(prefixL <= prefixR) { total += calcSuffixProjection(prefixL, prefixR); } r = prefixL - 1; } if(l <= r) { total += 1ll*getSum(2, l, r) * offset; } } ans.push_back(total); } return ans; }

Compilation message (stderr)

mosaic.cpp: In function 'void genLayers()':
mosaic.cpp:27:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   27 |     for(int j = 1; j < layers[i].size(); j++) {
      |                    ~~^~~~~~~~~~~~~~~~~~
mosaic.cpp:34:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   34 |   for(int i = 0; i < prefix.size(); i++) {
      |                  ~~^~~~~~~~~~~~~~~
mosaic.cpp: In function 'std::vector<long long int> mosaic(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
mosaic.cpp:74:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |     for(int i = 0; i < T.size(); i++) {
      |                    ~~^~~~~~~~~~
#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...