1 条题解

  • 0
    @ 2025-11-5 15:27:11
    • 尝试枚举每一个数 aia_i 作为矩形的高
    • 那么从 aia_i 往左右扩展的条件是,不能碰到比 aia_i 小的数
    • 也就是对每个 aia_i,要分别找到往左和往右第一个比 aia_i 小的数
    #include <bits/stdc++.h>
    using namespace std;
    
    int gao(vector<int>& h) {
        int n = h.size();
        vector<int> L(n, -1);  // L[i]: 表示 i 左边第一个比 h[i] 小的下标
        vector<int> R(n, n);   // R[i]: 表示 i 右边第一个比 h[i] 小的下标
        
        int e = 0;
        vector<int> s(n);
        
        // 只扫一遍, 同时确定 L 和 R
        for (int i = 0; i < n; i++) {
            // 出栈的时候确定右边第一个比自己小的
            while (e > 0 && h[s[e - 1]] > h[i]) R[s[--e]] = i;
            
            // 入栈的时候确定左边第一个比自己小的
            if (e > 0) L[i] = s[e - 1];
            s[e++] = i;
        }
        // for (int i = 0; i < n; i++) cout << L[i] << " \n"[i == n - 1];
        // for (int i = 0; i < n; i++) cout << R[i] << " \n"[i == n - 1];
        int ans = 0;
        for (int i = 0; i < n; i++) ans = max(ans, h[i] * (R[i] - L[i] - 1));
        return ans;
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr); cout.tie(nullptr);
    
        int n;
        cin >> n;
        vector<int> h(n);
        for (int i = 0; i < n; i++) cin >> h[i];
        cout << gao(h) << '\n';
    
        return 0;
    }
    
    • 1

    信息

    ID
    160
    时间
    100ms
    内存
    32MiB
    难度
    5
    标签
    递交数
    61
    已通过
    24
    上传者