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

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

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

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

 

ProblemLangVerdictTimeMemory
E - Water Balance GNU C++11Accepted873 ms15500 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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值