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;
}
posted @ 2024-09-11 19:57  yzc_is_SadBee  阅读(5)  评论(0编辑  收藏  举报