P3515
高效高效
分块。
here
#include<bits/stdc++.h>
using namespace std;
int n,a[500010];
double dp[500010],sqr[500010];
double w(int j,int i) {
return double(a[j])+sqr[i-j];
}
void work(int l,int r,int L,int R) {
if(l>r) return ;
int mid=l+r>>1,p;
double maxn=0;
for(int i=L; i<=min(mid,R); i++) {
if(w(i,mid)>maxn) maxn=w(i,mid),p=i;
}
dp[mid]=max(dp[mid],maxn);
work(l,mid-1,L,p);
work(mid+1,r,p,R);
}
int main() {
cin>>n;
for(int i=1; i<=n; i++) {
cin>>a[i];
sqr[i]=sqrt(i);
}
work(1,n,1,n);
for(int i=1; i<=n/2; i++) swap(a[i],a[n-i+1]),swap(dp[i],dp[n-i+1]);
work(1,n,1,n);
for(int i=n; i>=1; i--) cout<<(int)ceil(dp[i])-a[i]<<endl;
return 0;
}