[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;
}