[codeforces 1300E] Water Balance 单调栈+斜率优化+前缀和

[codeforces 1300E] Water Balance  单调栈+斜率优化+前缀和

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1300/problem/E

Problem Lang Verdict Time Memory
E - Water Balance GNU C++11 Accepted 873 ms 15500 KB

//单调栈+斜率优化+前缀和
//对前缀和的理解更深了。

思路同https://blog.csdn.net/weixin_42979819/article/details/104247338?fps=1&locationNum=2

前面的平均高度大于后面的高度就合并,用前缀和维护区间长度,然后单调栈维护序列.

#include <stdio.h>
#define LL long long
#define maxn 1000010
int a[maxn],st[maxn],top=0;
LL sum[maxn];
int main(){
	int n,i,j;
	scanf("%d",&n);
	for(i=1;i<=n;i++){
		scanf("%d",&a[i]);
		sum[i]=sum[i-1]+a[i];//前缀和
	}
	for(i=1;i<=n;i++){
		while(top&&(sum[i]-sum[st[top]])*(i-st[top-1])<=(sum[i]-sum[st[top-1]])*(i-st[top]))top--;//斜率优化
		st[++top]=i;
	}
	for(i=1;i<=top;i++){
		double ret=(sum[st[i]]-sum[st[i-1]])*1.0/(st[i]-st[i-1]);
		for(j=st[i-1]+1;j<=st[i];j++)printf("%.9lf\n",ret);
	}
	return 0;
}
发布了537 篇原创文章 · 获赞 529 · 访问量 44万+

猜你喜欢

转载自blog.csdn.net/mrcrack/article/details/104255030