제출 #824917

#제출 시각아이디문제언어결과실행 시간메모리
824917caganyanmazRectangles (IOI19_rect)C++17
50 / 100
312 ms111072 KiB
#include <bits/stdc++.h> #define pb push_back #define int int64_t #include "rect.h" using namespace std; constexpr static int UP = 0; constexpr static int DOWN = 1; constexpr static int LEFT = 2; constexpr static int RIGHT = 3; constexpr static int MXN = 2505; struct Fenwick { int v[MXN]; int get(int i) { int res = 0; for (++i; i > 0; i-=i&(-i)) res += v[i]; return res; } void set(int i, int val) { for (++i; i < MXN; i+=i&(-i)) v[i] += val; } int get(int l, int r) { return get(r) - get(l); } void reset() { fill(v, v + MXN, 0); } }; int vals[MXN][MXN][4]; void calculate_cell(int i, int j, const vector<vector<int32_t>>& a) { int ii, jj; for (ii = max<int>(i-1, 0); ii > 0; ii--) if (a[ii][j] >= a[i][j]) break; vals[i][j][UP] = ii; for (ii = min<int>(i+1, a.size()-1); ii < a.size() - 1; ii++) if (a[ii][j] >= a[i][j]) break; vals[i][j][DOWN] = ii; for (jj = max<int>(j-1, 0); jj > 0; jj--) if (a[i][jj] >= a[i][j]) break; vals[i][j][LEFT] = jj; for (jj = min<int>(j+1, a[0].size()-1); jj < a[0].size() - 1; jj++) if (a[i][jj] >= a[i][j]) break; vals[i][j][RIGHT] = jj; } int first[MXN]; int last[MXN]; int nxt[MXN]; Fenwick fw; int pf[MXN][MXN]; bitset<MXN> visited[MXN]; void check_try(int i, int j, queue<array<int, 2>>& q, vector<vector<int32_t>>& a) { if (i < a.size() && i >=0 && j < a[0].size() && j >= 0 && !visited[i][j] && a[i][j] == 0) { visited[i][j] = true; q.push({i, j}); } } long long special_subtask(vector<vector<int32_t>>& a) { for (int i = 1; i <= a.size(); i++) for (int j = 1; j <= a[0].size(); j++) pf[i][j] = pf[i][j-1] + pf[i-1][j] - pf[i-1][j-1] + a[i-1][j-1]; int res = 0; for (int i = 0; i < a.size(); i++) { for (int j = 0; j < a[0].size(); j++) { if (visited[i][j] || a[i][j] == 1) continue; queue<array<int, 2>> q; q.push({i, j}); int up = MXN; int down = -1; int left = MXN; int right = -1; while (q.size()) { auto [ii, jj] = q.front(); q.pop(); check_try(ii+1, jj, q, a); check_try(ii, jj+1, q, a); check_try(ii, jj-1, q,a ); check_try(ii-1, jj, q,a ); up = min(up, ii); down = max(down, ii); left = min(left, jj); right = max(right, jj); } if (pf[down+1][right+1] - pf[down+1][left] - pf[up][right+1] + pf[up][left] == 0 && down < a.size() - 1&& up > 0 && right < a[0].size() -1 && left > 0) res++; } } return res; } long long count_rectangles(vector<vector<int32_t>> a) { if (a.size() > 200) return special_subtask(a); for (int i = 0; i < a.size(); i++) { for (int j = 0; j < a[0].size(); j++) { calculate_cell(i, j, a); } } int res = 0; for (int u = 0; u < a.size()-1; u++) { fill(first, first + MXN, 0); fill(last, last + MXN, MXN); for (int d = u+2; d < a.size(); d++) { fw.reset(); for (int i = 0; i < a[0].size(); i++) first[i] = max<int>(first[i], vals[d-1][i][LEFT]); // Getting the leftmost possible for each of them for (int i = 0; i < a[0].size(); i++) last[i] = min<int>(last[i], vals[d-1][i][RIGHT]); vector<vector<int>> rrr(a[0].size()); for (int i = 0; i < a[0].size(); i++) rrr[first[i]].pb(i); vector<int> pending; for (int i = 0; i < a[0].size(); i++) { pending.pb(i); if (vals[u][i][DOWN] < d || vals[d][i][UP] > u) { for (int j : pending) nxt[j] = i; pending.clear(); } } for (int j : pending) nxt[j] = a[0].size(); for (int i = 0; i < a[0].size(); i++) { for (int j : rrr[i]) { fw.set(j, 1); } if (min(last[i], nxt[i+1]) > i+1) { res += fw.get(i+1, min(last[i], nxt[i+1])); } } } } return res; }

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

rect.cpp: In function 'void calculate_cell(int64_t, int64_t, const std::vector<std::vector<int> >&)':
rect.cpp:32:42: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   32 |  for (ii = min<int>(i+1, a.size()-1); ii < a.size() - 1; ii++)
      |                                       ~~~^~~~~~~~~~~~~~
rect.cpp:40:45: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |  for (jj = min<int>(j+1, a[0].size()-1); jj < a[0].size() - 1; jj++)
      |                                          ~~~^~~~~~~~~~~~~~~~~
rect.cpp: In function 'void check_try(int64_t, int64_t, std::queue<std::array<long int, 2> >&, std::vector<std::vector<int> >&)':
rect.cpp:57:8: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |  if (i < a.size() && i >=0 && j < a[0].size() && j >= 0 && !visited[i][j] && a[i][j] == 0)
      |      ~~^~~~~~~~~~
rect.cpp:57:33: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |  if (i < a.size() && i >=0 && j < a[0].size() && j >= 0 && !visited[i][j] && a[i][j] == 0)
      |                               ~~^~~~~~~~~~~~~
rect.cpp: In function 'long long int special_subtask(std::vector<std::vector<int> >&)':
rect.cpp:68:20: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |  for (int i = 1; i <= a.size(); i++)
      |                  ~~^~~~~~~~~~~
rect.cpp:69:21: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |   for (int j = 1; j <= a[0].size(); j++)
      |                   ~~^~~~~~~~~~~~~~
rect.cpp:72:20: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   72 |  for (int i = 0; i < a.size(); i++)
      |                  ~~^~~~~~~~~~
rect.cpp:74:21: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |   for (int j = 0; j < a[0].size(); j++)
      |                   ~~^~~~~~~~~~~~~
rect.cpp:97:93: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   97 |    if (pf[down+1][right+1] - pf[down+1][left] - pf[up][right+1] + pf[up][left] == 0 && down < a.size() - 1&& up > 0 && right < a[0].size() -1 && left > 0)
      |                                                                                        ~~~~~^~~~~~~~~~~~~~
rect.cpp:97:126: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   97 |    if (pf[down+1][right+1] - pf[down+1][left] - pf[up][right+1] + pf[up][left] == 0 && down < a.size() - 1&& up > 0 && right < a[0].size() -1 && left > 0)
      |                                                                                                                        ~~~~~~^~~~~~~~~~~~~~~~
rect.cpp: In function 'long long int count_rectangles(std::vector<std::vector<int> >)':
rect.cpp:107:20: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  107 |  for (int i = 0; i < a.size(); i++)
      |                  ~~^~~~~~~~~~
rect.cpp:109:21: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  109 |   for (int j = 0; j < a[0].size(); j++)
      |                   ~~^~~~~~~~~~~~~
rect.cpp:115:20: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  115 |  for (int u = 0; u < a.size()-1; u++)
      |                  ~~^~~~~~~~~~~~
rect.cpp:119:23: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  119 |   for (int d = u+2; d < a.size(); d++)
      |                     ~~^~~~~~~~~~
rect.cpp:122:22: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  122 |    for (int i = 0; i < a[0].size(); i++)
      |                    ~~^~~~~~~~~~~~~
rect.cpp:124:22: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  124 |    for (int i = 0; i < a[0].size(); i++)
      |                    ~~^~~~~~~~~~~~~
rect.cpp:127:22: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  127 |    for (int i = 0; i < a[0].size(); i++)
      |                    ~~^~~~~~~~~~~~~
rect.cpp:130:22: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  130 |    for (int i = 0; i < a[0].size(); i++)
      |                    ~~^~~~~~~~~~~~~
rect.cpp:142:22: warning: comparison of integer expressions of different signedness: 'int64_t' {aka 'long int'} and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  142 |    for (int i = 0; i < a[0].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...