Submission #1031019

#TimeUsernameProblemLanguageResultExecution timeMemory
1031019ZicrusRectangles (IOI19_rect)C++17
37 / 100
5059 ms388580 KiB
#include <bits/stdc++.h> #include "rect.h" using namespace std; typedef long long ll; ll n, m; ll pow2N, pow2M; vector<vector<ll>> segN, segM; ll segMaxN(ll low, ll high, ll m) { low += pow2N; high += pow2N; ll mx = 0; while (low <= high) { if (low & 1) mx = max(mx, segN[m][low++]); if (!(high & 1)) mx = max(mx, segN[m][high--]); low /= 2; high /= 2; } return mx; } ll segMaxM(ll low, ll high, ll n) { low += pow2M; high += pow2M; ll mx = 0; while (low <= high) { if (low & 1) mx = max(mx, segM[n][low++]); if (!(high & 1)) mx = max(mx, segM[n][high--]); low /= 2; high /= 2; } return mx; } ll count_rectangles(vector<vector<int>> a) { if (a.size() <= 2) return 0; n = a.size(); m = a[0].size(); pow2N = 1ll << (ll)ceil(log2(n)); pow2M = 1ll << (ll)ceil(log2(m)); vector<int> am = a[1]; segN = vector<vector<ll>>(m, vector<ll>(2*pow2N)); segM = vector<vector<ll>>(n, vector<ll>(2*pow2M)); for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { segN[j][pow2N+i] = a[i][j]; segM[i][pow2M+j] = a[i][j]; } } for (int meta = 0; meta < n; meta++) { for (int i = pow2M-1; i > 0; i--) { segM[meta][i] = max(segM[meta][2*i], segM[meta][2*i+1]); } } for (int meta = 0; meta < m; meta++) { for (int i = pow2N-1; i > 0; i--) { segN[meta][i] = max(segN[meta][2*i], segN[meta][2*i+1]); } } unordered_set<ll> s; ll res = 0; for (int i = 1; i < n-1; i++) { for (int j = 1; j < m-1; j++) { ll left = j, right = j, top = i, bottom = i; ll ref = a[i][j]; ll low = 0, high = j; while (low < high) { ll mid = (low + high + 1) / 2; if (segMaxM(mid, high, i) <= ref) { high = mid-1; } else { low = mid; } } left = low+1; low = j, high = m-1; while (low < high) { ll mid = (low + high) / 2; if (segMaxM(low, mid, i) <= ref) { low = mid+1; } else { high = mid; } } right = high-1; while (a[top][j] <= ref && top > 0) top--; top++; while (a[bottom][j] <= ref && bottom < n-1) bottom++; bottom--; ll hash = (left << 48) | (right << 32) | (top << 16) | bottom; if (s.count(hash)) continue; s.insert(hash); ll lN = bottom-top+1, lM = right-left+1; bool poss = 1; for (int meta = top; meta < top+lN && poss; meta++) { ll border = min(a[meta][left-1], a[meta][left+lM]); if (border <= segMaxM(left, left+lM-1, meta)) { poss = 0; } } for (int meta = left; meta < left+lM && poss; meta++) { ll border = min(a[top-1][meta], a[top+lN][meta]); if (border <= segMaxN(top, top+lN-1, meta)) { poss = 0; } } res += poss; } } return res; }

Compilation message (stderr)

rect.cpp: In function 'll count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:88:13: warning: this 'while' clause does not guard... [-Wmisleading-indentation]
   88 |             while (a[top][j] <= ref && top > 0) top--; top++;
      |             ^~~~~
rect.cpp:88:56: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'while'
   88 |             while (a[top][j] <= ref && top > 0) top--; top++;
      |                                                        ^~~
rect.cpp:89:13: warning: this 'while' clause does not guard... [-Wmisleading-indentation]
   89 |             while (a[bottom][j] <= ref && bottom < n-1) bottom++; bottom--;
      |             ^~~~~
rect.cpp:89:67: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'while'
   89 |             while (a[bottom][j] <= ref && bottom < n-1) bottom++; bottom--;
      |                                                                   ^~~~~~
#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...