Advertisement
Dang_Quan_10_Tin

MSQUARE (CSPTST 2022-2023)

Oct 4th, 2022 (edited)
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.74 KB | None | 0 0
  1. #define task "MSQUARE"
  2. #include <iostream>
  3. #include <cstdio>
  4. #include <vector>
  5. #include <deque>
  6. #include <queue>
  7. #include <set>
  8.  
  9. using namespace std;
  10.  
  11. using ll = long long;
  12. using ld = long double;
  13.  
  14. constexpr int N = 1e6 + 5;
  15. int m, n;
  16. vector<int> b[N];
  17. vector<pair<int, int>> s[N * 2];
  18. vector<int> l[N * 2], r[N * 2];
  19.  
  20. void Read()
  21. {
  22.     cin >> m >> n;
  23.  
  24.     b[0].resize(n + 1, 0);
  25.  
  26.     for (int i = 1; i <= m; ++i)
  27.     {
  28.         b[i].resize(n + 1, 0);
  29.  
  30.         for (int j = 1; j <= n; ++j)
  31.         {
  32.             cin >> b[i][j];
  33.             b[i][j] = b[i - 1][j] + b[i][j - 1] - b[i - 1][j - 1] + b[i][j];
  34.         }
  35.     }
  36. }
  37.  
  38. #define Cal(x, y, z, t) (b[z][t] - b[x - 1][t] - b[z][y - 1] + b[x - 1][y - 1])
  39.  
  40. int Get(const vector<pair<int, int>> &a)
  41. {
  42.     priority_queue<pair<int, int>> q;
  43.     set<int> s;
  44.  
  45.     int ans = 0;
  46.  
  47.     for (int i = 0; i < (int)a.size(); ++i)
  48.     {
  49.         q.emplace(-(a[i].second + i - 1), i);
  50.         s.insert(i);
  51.  
  52.         while (!q.empty() && -q.top().first < i)
  53.         {
  54.             s.erase(q.top().second);
  55.             q.pop();
  56.         }
  57.  
  58.         if (!q.empty())
  59.         {
  60.             auto x = s.lower_bound(i - a[i].first + 1);
  61.             if (x != s.end())
  62.                 ans = max(ans, i - (*x) + 1);
  63.         }
  64.     }
  65.  
  66.     return ans;
  67. }
  68.  
  69. void Solve()
  70. {
  71.  
  72.     /*
  73.                 1
  74.                 ^
  75.                 |
  76.          2 <- (i, j) -> 3
  77.                 |
  78.                 v
  79.                 4
  80.      */
  81.     // Tinh (1-3) va (2-4)
  82.  
  83.     for (int i = 1; i <= m; ++i)
  84.         for (int j = 1; j <= n; ++j)
  85.         {
  86.             //(1-3)
  87.             int l = 1, mid, h = min(i, n - j + 1);
  88.             while (l <= h)
  89.             {
  90.                 mid = (l + h) / 2;
  91.                 if (Cal(i - mid + 1, j, i, j) == mid && Cal(i, j, i, j + mid - 1) == mid)
  92.                     l = mid + 1;
  93.                 else
  94.                     h = mid - 1;
  95.             }
  96.  
  97.             int x = h;
  98.  
  99.             // (2-4)
  100.             l = 1, h = min(j, m - i + 1);
  101.             while (l <= h)
  102.             {
  103.                 mid = (l + h) / 2;
  104.                 if (Cal(i, j - mid + 1, i, j) == mid && Cal(i, j, i + mid - 1, j) == mid)
  105.                     l = mid + 1;
  106.                 else
  107.                     h = mid - 1;
  108.             }
  109.  
  110.             int y = h;
  111.  
  112.             s[i + j - 1].emplace_back(x, y);
  113.         }
  114.  
  115.     int ans = 0;
  116.  
  117.     for (int i = 1; i < m + n; ++i)
  118.         ans = max(ans, Get(s[i]));
  119.  
  120.     cout << ans * ans;
  121. }
  122.  
  123. int32_t main()
  124. {
  125.     ios_base::sync_with_stdio(0);
  126.     cin.tie(0);
  127.     cout.tie(0);
  128.  
  129.     if (fopen(task ".INP", "r"))
  130.     {
  131.         freopen(task ".INP", "r", stdin);
  132.         freopen(task ".OUT", "w", stdout);
  133.     }
  134.  
  135.     Read();
  136.     Solve();
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement