제출 #1030985

#제출 시각아이디문제언어결과실행 시간메모리
1030985ZicrusRectangles (IOI19_rect)C++17
37 / 100
5078 ms394928 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]; while (a[i][left] <= ref && left > 0) left--; left++; while (a[i][right] <= ref && right < m-1) right++; right--; 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; }

컴파일 시 표준 에러 (stderr) 메시지

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