比赛 |
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;
}