虹色的北斗七星 题解
题目简述
你有一个长度为
题目传送门:P8446 虹色的北斗七星
题目分析
这是道最优化问题,关键点在于对问题的转化。
题目中最显而易见的一点是
说实话这题本蒟蒻在比赛时想了很久,从动态规划到二分答案甚至连分治都考虑过,不过全部以不可行告终 要不是普及组不能超纲,我肯定浪费更多时间。
我发现自己在之前的思考中都潜意识地将
意识到这点后我开始想,是不是可以将
如果可以将
于是乎,分类讨论!
-
当
\max 对应的下标是r ,也就是\max 在\min 右边时:(\max-r)-(\min-l)-1 -
当
\max 对应的下标是l ,也就是\max 在\min 左边时:(\max+l)-(\min+r)-1
解释一下,如果是第一种情况的话,我们建立
可以看出这时算出来的值正好是区间的价值。第二种情况的话使
到这儿,我们已经可以将原问题转换为两个子问题了:
最后将两个子问题合并,既取其中的最大值,就得到了问题的最终答案。
code
#include<bits/stdc++.h>
#define N 4000005
#define ll long long
using namespace std;
int n,a[N],b[N],ans=-1;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int main(){
n=read();
for(int i=1;i<=n;i++)
a[i]=read(),b[i]=a[i]-i;
for(int i=1,mn=1e9;i<=n;i++){
mn=min(b[i],mn);
ans=max(ans,b[i]-mn);
b[i]=a[i]+i;
}
for(int i=1,mx=-1e9;i<=n;i++){
mx=max(b[i],mx);
ans=max(ans,mx-b[i]);
}
cout<<ans-1;
return 0;
}