社区讨论
ST表求条悬3关
P2422良好的感觉参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @mln8rjvs
- 此快照首次捕获于
- 2026/02/15 12:24 4 天前
- 此快照最后确认于
- 2026/02/19 12:10 3 分钟前
CPP
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
const int MAXN = 1e5 + 5;
const int LOG = 20;
int n;
int a[MAXN], sum[MAXN];
struct ST {
int St[MAXN][LOG], t;
int LOG2(int x) {
return 31 - __builtin_clz(x);
}
void build() {
t = LOG2(n);
for (int i = 1; i <= n; i++) {
St[i][0] = a[i];
}
for (int j = 1; j <= t; j++) {
for (int i = 1; i + (1 << j) - 1 <= n; i++) {
St[i][j] = min(St[i][j - 1], St[i + (1 << (j - 1))][j - 1]);
}
}
}
int query(int l, int r) {
int k = LOG2(r - l + 1);
return min(St[l][k], St[r - (1 << k) + 1][k]);
}
}st;
signed main(){
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> a[i];
sum[i] = sum[i - 1] + a[i];
}
st.build();
int ans = 0;
for (int i = 1; i <= n; i++) {
int l = 1, r = i - 1, le = i;//左边界,le - i
while (l <= r) {
int mid = (l + r) / 2;
if (st.query(mid, i) == a[i]) {
r = mid - 1;
le = mid;
} else {
l = mid + 1;
}
}
l = i + 1, r = n;
int ri = i;//右边界,i - ri
while (l <= r) {
int mid = (l + r) / 2;
if (st.query(i, mid) == a[i]) {
l = mid + 1;
ri = mid;
} else {
r = mid - 1;
}
}
ans = max(ans, st.query(le, ri) * (sum[ri] - sum[le - 1]));
}
cout << ans;
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...