제출 #697258

#제출 시각아이디문제언어결과실행 시간메모리
697258allllekssssaBomb (IZhO17_bomb)C++14
59 / 100
912 ms76716 KiB
#include<bits/stdc++.h> using namespace std; #define pii pair<int ,int> #define pb push_back const int maxN = 2600; int n, m; int a[maxN][maxN]; int d[maxN][maxN]; int c[maxN][maxN]; string s; int cnt[maxN]; int getDSum(int x1, int y1, int x2, int y2) { if (x2 > n || y2 > m) return 0; return d[x2][y2] + d[x1 - 1][y1 - 1] - d[x1 - 1][y2] - d[x2][y1 - 1]; } int getCSum(int x1, int y1, int x2, int y2) { x1 = max(x1, 1); y1 = max(y1, 1); return c[x2][y2] + c[x1 - 1][y1 - 1] - c[x1 - 1][y2] - c[x2][y1 - 1]; } bool check(int x, int y) { for (int i = 1; i<=n; i++) { for (int j = 1; j<=m; j++) { c[i][j] = 0; } } for (int i = 1; i<=n; i++) { for (int j = 1; j<=m; j++) { if (getDSum(i, j, i + x - 1, j + y - 1) == x * y) c[i][j] = 1; } } for (int i = 1; i <= n; i++) { for (int j = 1; j<=m; j++) { c[i][j] += c[i - 1][j] + c[i][j - 1] - c[i - 1][j - 1]; } } for (int i = 1; i<=n; i++) { for (int j = 1; j <= m; j++) { if (a[i][j] && getCSum(i - x + 1, j - y + 1, i, j) == 0) return false; } } return true; } int heuristic1() { vector<pii> gornji; for (int i = 1; i<=n; i++) { for (int j = 1; j<=m; j++) { if (a[i - 1][j] == 0 && a[i][j - 1] == 0 && a[i][j] == 1) gornji.pb({i, j}); } } random_shuffle(gornji.begin(), gornji.end()); for (int i = 1; i <=n; i++) { cnt[i] = m; } for (int i = 0; i < min(600, (int) gornji.size()); i++) { for (int len = 1; len <= n; len++) { int x = gornji[i].first; int y = gornji[i].second; int lo = -1; int ro = m + 1; while(lo < ro - 1) { int mid = lo + ro >> 1; if (getDSum(x, y, x + len - 1, y + mid - 1) == len * mid) lo = mid; else ro = mid; } cnt[len] = min(cnt[len], lo); } } int ans = 0; for (int i = 1; i<=n; i++) { ans = max(ans, i * cnt[i]); } return ans; } int heuristic() { int minW = n; int minH = m; for (int i = 1; i<=n; i++) { int cur = 0; for (int j = 1; j<=m; j++) { if (a[i][j] == 1) cur++; else { if (cur > 0) { minH = min(minH, cur); cur = 0; } } } if (cur > 0) minH = min(minH, cur); } for (int j = 1; j<=m; j++) { int cur = 0; for (int i = 1; i<=n; i++) { if (a[i][j] == 1) cur++; else { if (cur > 0) { minW = min(minW, cur); cur = 0; } } } if (cur > 0) minW = min(minW, cur); } int ans = minW * minH; if (!check(minW, minH)) return heuristic1(); return ans; } int main() { cin >> n >> m; for (int i = 1; i <=n; i++) { cin >> s; for (int j = 0; j < m; j++) { a[i][j + 1] = s[j] - '0'; } } for (int i = 1; i <= n; i++) { for (int j = 1; j<=m; j++) { d[i][j] = d[i - 1][j] + d[i][j - 1] + a[i][j] - d[i - 1][j - 1]; } } if (n > 450 || m > 450) { cout << heuristic() << endl; return 0; } int ans = 0; int width = m; for (int i = 1; i <=n; i++) { while (width > 0 && !check(i, width)) width--; ans = max(ans, i * width); } cout << ans << endl; }

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

bomb.cpp: In function 'int heuristic1()':
bomb.cpp:83:26: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   83 |             int mid = lo + ro >> 1;
      |                       ~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...