洛谷 P12241 [蓝桥杯 2023 国 C] 最大区间

题目描述

给定一个长度为 \(n\) 的序列 \(A_i\),求 \(L, R\) 使 \((R - L + 1) \cdot \min(A_L, A_{L+1}, \ldots, A_R)\) 尽可能大,其中 \(\min\) 表示最小值。

你只需要输出最大的值即可,不需要输出具体的 \(L, R\)

输入格式

输入的第一行包含一个整数 \(n\)

第二行包含 \(n\) 个整数,分别表示 \(A_1, A_2, \ldots, A_n\),相邻两个整数之间使用一个空格分隔。

输出格式

输出一行包含一个整数表示答案。

输入输出样例 #1

输入 #1

5
1 1 3 3 1

输出 #1

6

说明/提示

评测用例规模与约定

对于 \(40\%\) 的评测用例,\(1 \leq n \leq 5000\)\(1 \leq A_i \leq 5000\)

对于所有评测用例,\(1 \leq n \leq 3 \times 10^5\)\(1 \leq A_i \leq 10^9\)


$ \mathcal{O}(n^3) $ 做法

#include <bits/stdc++.h>

using namespace std;

int a[], n;

int st[N][LOGN];

int query(int l, int r) {
    int k = __lg(r - l + 1);
    return min(st[l][k], st[r - (1 << k) + 1][k]);
}

int QueryL(int x) {
    int lo = 1, hi = x - 1;
    while (lo < hi) {
        int mid = (lo + hi + 1) / 2;
        if (query(mid, x) == a[x]) {
            hi = mid - 1;
        } else {
            lo = mid;
        }
    }
    return a[lo] < a[x] ? lo : 0;
}
/* [L, R]
[L + 1, R - 1] */

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    for (int i = 1; i <= n; i++) {
        
    }
    return 0;
}
posted @ 2026-07-20 14:25  Smash1  阅读(4)  评论(0)    收藏  举报