题目描述
题解
移项
p≥aj+|i−j|−−−−−√−ai
正着做一遍反着做一遍然后就可以把绝对值啥的去掉了
以正着做为例
p≥aj+i−j−−−−√+ai
实际上如果令
f(i)=max{aj+i−j−−−−√}−ai
,就是要求
f(i)max
dp?
O(n2)
如何优化?
ai
的值已经给出,也就是说,
f(i)
与
f(j)
无关
可以证明这个式子是满足决策单调性的?
打表吧
随便加个二分
O(nlogn)
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define N 500005
int n;
double ans;
double a[N],f[N],g[N];
int df[N],dg[N];
void dvd(double *f,int l,int r,int x,int y)
{
if (l>r||x>y) return;
int mid=(l+r)>>1;
double p;int d;
for (int i=x;i<=y&&i<=mid;++i)
if ((p=a[i]+sqrt((double)mid-i))>f[mid])
{
f[mid]=p;
d=i;
}
f[mid]-=a[mid];
dvd(f,l,mid-1,x,d);
dvd(f,mid+1,r,d,y);
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;++i) scanf("%lf",&a[i]);
memset(f,128,sizeof(f));
dvd(f,1,n,1,n);
for (int i=1;i<=n>>1;++i) swap(a[i],a[n-i+1]);
memset(g,128,sizeof(g));
dvd(g,1,n,1,n);
for (int i=1;i<=n;++i) printf("%.0lf\n",ceil(max(f[i],g[n-i+1])));
}