比赛 20191022轻松模拟测试 评测结果 AAAAAAAAAAA
题目名称 (USACO Dec18)平衡木 最终得分 100
用户昵称 梦那边的美好ET 运行时间 1.066 s
代码语言 C++ 内存使用 15.95 MiB
提交时间 2019-10-23 19:10:19
显示代码纯文本
#include<bits/stdc++.h>
#define db double 
#define LL long long
#define maxn 100010
using namespace std;
LL n,d[maxn],ld;
struct node{db x,y;}a[maxn];
double K(node a1,node a2){return (a1.y-a2.y)/(a1.x-a2.x);}
double solve(node a1,node a2,double z){return a1.y+(a2.y-a1.y)/(a2.x-a1.x)*(z-a1.x);}
int main(){
	freopen("balance_beam.in","r",stdin);
	freopen("balance_beam.out","w",stdout);
	scanf("%lld",&n);a[n+1].x=(db)(n+1);
	for(int i=1;i<=n;i++)scanf("%lf",&a[i].y),a[i].y*=(db)100000,a[i].x=(db)i;
	for(int i=0;i<=n+1;i++){
		d[++ld]=i;
		while(ld>=3&&K(a[d[ld-2]],a[d[ld-1]])<=K(a[d[ld-2]],a[d[ld]]))
		    ld--,d[ld]=d[ld+1];
	}int now=1;
	for(int i=1;i<=n;i++){
		db ans;while(i>a[d[now+1]].x&&now<ld-1)now++;
		ans=solve(a[d[now]],a[d[now+1]],(db)i);
		printf("%.0lf\n",ans);
	}
	return 0;
}