记录编号 174627 评测结果 AAAAAAAAAA
题目名称 [HNOI 2008]玩具装箱toy 最终得分 100
用户昵称 Gravatarforever 是否通过 通过
代码语言 C++ 运行时间 0.124 s
提交时间 2015-08-02 06:18:47 内存使用 10.58 MiB
显示代码纯文本
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. using namespace std;
  5. long long n,l,sum[500002],dp[500002],q[500002];
  6. int h,tail,head;
  7. long long getsum(int i,int j){
  8. return (sum[i]-sum[j]+i-j-1-l)*(sum[i]-sum[j]+i-j-1-l);
  9. }
  10. long long getup(int i,int j){
  11. return dp[i]+(sum[i]+i)*(sum[i]+i)-(dp[j]+(sum[j]+j)*(sum[j]+j));
  12. }
  13. long long getdown(int i,int j){
  14. return (sum[i]+i)-(sum[j]+j);
  15. }
  16. int main(){
  17. freopen("bzoj_1010.in","r",stdin);
  18. freopen("bzoj_1010.out","w",stdout);
  19. scanf("%d%d",&n,&l);
  20. for(int i=1;i<=n;++i){
  21. scanf("%d",&h);
  22. sum[i]=sum[i-1]+h;
  23. }
  24. tail=head=0;
  25. dp[0]=sum[0]=0;
  26. q[tail++]=0;
  27. for(int i=1;i<=n;++i){
  28. int rt=sum[i]+i-l-1;
  29. while(tail>head+1&&getup(q[head+1],q[head])<=2*rt*getdown(q[head+1],q[head]))
  30. head++;
  31. dp[i]=dp[q[head]]+getsum(i,q[head]);
  32. while(tail>head+1&&getup(i,q[tail-1])*getdown(q[tail-1],q[tail-2])<=getup(q[tail-1],q[tail-2])*getdown(i,q[tail-1]))
  33. tail--;
  34. q[tail++]=i;
  35. }
  36. printf("%lld",dp[n]);
  37. }