Submission #1360939

#TimeUsernameProblemLanguageResultExecution timeMemory
1360939tickcrossy축구 경기장 (IOI23_soccer)C++20
0 / 100
0 ms344 KiB
#include <vector>
#include <algorithm>
#include <iostream>

using namespace std;

int biggest_stadium(int N, std::vector<std::vector<int>> F) {
    // 寻找没有树的情况,直接返回整片森林大小
    long long total_empty = 0;
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            if (F[i][j] == 0) total_empty++;
        }
    }
    if (total_empty == N * N) return N * N;
    if (total_empty == 0) return 0;

    int max_area = 0;

    // up[i][j] 记录 (i, j) 及其上方连续的空单元格数
    // down[i][j] 记录 (i, j) 及其下方连续的空单元格数
    vector<vector<int>> up(N, vector<int>(N, 0));
    vector<vector<int>> down(N, vector<int>(N, 0));

    for (int j = 0; j < N; ++j) {
        int cnt = 0;
        for (int i = 0; i < N; ++i) {
            if (F[i][j] == 0) cnt++;
            else cnt = 0;
            up[i][j] = cnt;
        }
        cnt = 0;
        for (int i = N - 1; i >= 0; --i) {
            if (F[i][j] == 0) cnt++;
            else cnt = 0;
            down[i][j] = cnt;
        }
    }

    // 通过枚举作为“骨架”的行
    for (int i = 0; i < N; ++i) {
        vector<int> h(N, 0);
        for (int j = 0; j < N; ++j) {
            if (F[i][j] == 0) {
                h[j] = up[i][j] + down[i][j] - 1;
            }
        }
        
        // 类似于最大矩形算法,利用单调栈处理当前行为基准的最大外扩
        vector<int> left(N, 0), right(N, N - 1);
        vector<int> st;
        for (int j = 0; j < N; ++j) {
            while (!st.empty() && h[st.back()] >= h[j]) {
                st.pop_back();
            }
            left[j] = st.empty() ? 0 : st.back() + 1;
            st.push_back(j);
        }
        
        st.clear();
        for (int j = N - 1; j >= 0; --j) {
            while (!st.empty() && h[st.back()] >= h[j]) {
                st.pop_back();
            }
            right[j] = st.empty() ? N - 1 : st.back() - 1;
            st.push_back(j);
        }

        for (int j = 0; j < N; ++j) {
            if (h[j] > 0) {
                int area = h[j] * (right[j] - left[j] + 1);
                if (area > max_area) {
                    max_area = area;
                }
            }
        }
    }
    
    // DP 求解最大嵌套核心面积扩展
    // 我们同样需要在垂直方向跑一趟对称的逻辑并融合两者最大值,此部分为二维拓展的基座
    vector<vector<int>> left_arr(N, vector<int>(N, 0));
    vector<vector<int>> right_arr(N, vector<int>(N, 0));
    for (int i = 0; i < N; ++i) {
        int cnt = 0;
        for (int j = 0; j < N; ++j) {
            if (F[i][j] == 0) cnt++;
            else cnt = 0;
            left_arr[i][j] = cnt;
        }
        cnt = 0;
        for (int j = N - 1; j >= 0; --j) {
            if (F[i][j] == 0) cnt++;
            else cnt = 0;
            right_arr[i][j] = cnt;
        }
    }

    for (int j = 0; j < N; ++j) {
        vector<int> w(N, 0);
        for (int i = 0; i < N; ++i) {
            if (F[i][j] == 0) {
                w[i] = left_arr[i][j] + right_arr[i][j] - 1;
            }
        }
        
        vector<int> up_limit(N, 0), down_limit(N, N - 1);
        vector<int> st;
        for (int i = 0; i < N; ++i) {
            while (!st.empty() && w[st.back()] >= w[i]) st.pop_back();
            up_limit[i] = st.empty() ? 0 : st.back() + 1;
            st.push_back(i);
        }
        
        st.clear();
        for (int i = N - 1; i >= 0; --i) {
            while (!st.empty() && w[st.back()] >= w[i]) st.pop_back();
            down_limit[i] = st.empty() ? N - 1 : st.back() - 1;
            st.push_back(i);
        }

        for (int i = 0; i < N; ++i) {
            if (w[i] > 0) {
                int area = w[i] * (down_limit[i] - up_limit[i] + 1);
                if (area > max_area) {
                    max_area = area;
                }
            }
        }
    }

    // 返回能构造出的合法区域的最大值(子任务兼容基准)
    return max_area;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...