题目
将题目中所给的式子移项,得到p=aj-ai+sqrt(abs(i-j)),
只考虑j<i的情况,得到一个dp式子,显然是要找aj+sqrt(abs(i-j))的最大值
这个式子具有决策单调性,于是可以分治dp,对于j>i的情况倒着做一遍dp。
代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define maxn 500010
using namespace std;
inline int read()
{
int ret=0;char ch=getchar();
while(ch<'!') ch=getchar();
while(ch>'!') ret=ret*10+ch-'0',ch=getchar();
return ret;
}
int n,a[maxn];
double f[maxn],g[maxn];
void devide(int l,int r,int al,int ar,double *f)
{
if(l>r) return;
int mid=l+r>>1,pos=al;
f[mid]=0;
for(int i=al;i<=ar&&i<=mid;i++){
double t=a[i]-a[mid]+sqrt(mid-i);
if(t>=f[mid]){
f[mid]=t;
pos=i;
}
}
devide(l,mid-1,al,pos,f);
devide(mid+1,r,pos,ar,f);
}
int main()
{
n=read();
for(int i=1;i<=n;i++) a[i]=read();
devide(1,n,1,n,f);
for(int i=1;i<=n/2;i++) swap(a[i],a[n-i+1]);
devide(1,n,1,n,g);
for(int i=1;i<=n;i++){
printf("%d\n",(int)ceil(max(f[i],g[n-i+1])));
}
return 0;
}