专栏文章
题解:P12241 [蓝桥杯 2023 国 C] 最大区间
P12241题解参与者 2已保存评论 1
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mipb48rs
- 此快照首次捕获于
- 2025/12/03 09:07 3 个月前
- 此快照最后确认于
- 2025/12/03 09:07 3 个月前
思路:
我们可以假设以某一个 为最小值,使其向左右延伸。显然地,延伸的区间越长越好,那就可以用悬线法求出区间(即求出左右第一个大于它的位置。),最后求最大值即可。
悬线法:
定义 为当前找到的 位置的悬线能扩展到的最左边的位置,容易得到 初始为 ,我们需要进一步判断还能不能进一步往左扩展。
如果当前 ,则已经扩展到了边界,不可以。
如果当前 ,则从当前悬线扩展到的位置不能再往左扩展了。
代码:
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+5;
int n,ans;
long long a[N],l[N],r[N];
signed main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
l[i]=r[i]=i;
}
for(int i=1;i<=n;i++)
while(l[i]>1&&a[i]<=a[l[i]-1])l[i]=l[l[i]-1];
for(int i=n;i>=1;i--)
while(r[i]<n&&a[i]<=a[r[i]+1])r[i]=r[r[i]+1];
for(int i=1;i<=n;i++)
if((r[i]-l[i]+1)*a[i]>ans)
ans=(r[i]-l[i]+1)*a[i];
cout<<ans;
return 0;
}
相关推荐
评论
共 1 条评论,欢迎与作者交流。
正在加载评论...