洛谷 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;
}

浙公网安备 33010602011771号