제출 #1228964

#제출 시각아이디문제언어결과실행 시간메모리
1228964toast12호화 벙커 (IZhO13_burrow)C++20
100 / 100
624 ms12308 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

int main() {
    int n, m, k;
    cin >> n >> m >> k;
    vector<vector<int>> a(n+2, vector<int>(m+2));
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= m; j++) cin >> a[i][j];
    }
    ll lo = 0, hi = 1e9;
    ll sz = 0;
    while (lo < hi) {
        ll mid = (lo+hi+1)/2;
        vector<vector<int>> v(n+2, vector<int>(m+2));
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (a[i][j] >= mid) v[i][j] = 1;
            }
        }
        vector<vector<int>> b(n+2, vector<int>(m+2));
        b[1] = v[1];
        for (int i = 2; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (v[i][j]) b[i][j] = b[i-1][j]+1;
                else b[i][j] = 0;
            }
        }
        ll mx_size = 0;
        for (int i = 1; i <= n; i++) {
            vector<int> left(m+1), right(m+1, m+1);
            stack<int> st;
            for (int j = 1; j <= m; j++) {
                while (!st.empty() && b[i][st.top()] > b[i][j]) {
                    right[st.top()] = j;
                    st.pop();
                }
                st.push(j);
            }
            while (!st.empty()) st.pop();
            for (int j = m; j >= 1; j--) {
                while (!st.empty() && b[i][st.top()] > b[i][j]) {
                    left[st.top()] = j;
                    st.pop();
                }
                st.push(j);
            }
            for (int j = 1; j <= m; j++) {
                if ((right[j]-left[j]-1)*b[i][j] >= k) {
                    mx_size = max(mx_size, 1ll*(right[j]-left[j]-1)*b[i][j]);
                }
            }
        }
        if (mx_size) lo = mid, sz = mx_size;
        else hi = mid-1;
    }
    cout << lo << ' ' << sz << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...