[BZOJ2650]积木
[BZOJ2650]积木
题目大意:
有一排\(n\)个积木,第\(i\)个积木的高度为\(h_i\),定义混乱值为相邻两个积木高度之差的绝对值之和乘上系数\(c\)。可以花费\(t^2\)的代价将一个积木高度增加\(t\)。求花费与混乱值之和的最小值。
思路:
\(f_i\)表示前\(i\)个建筑,第\(i\)个高度不变。枚举上一个高度不变的积木\(j\),此时将中间一段最低点为\(k\),将这一段高度调整成一样的最优,转移方程为:
\]
而其中\(k\)可以通过计算二次函数的对称轴得到。
考虑哪些\(j\)的转移会对答案产生贡献,由于只有在\(h_k\le\min(h_i,h_j)\)时增加积木高度答案才会比不增加更优,因此我们可以维护一个关于高度单调下降的栈,每次从栈顶取出一个\(k\),以及栈中第二个数\(j\)用来转移。时间复杂度\(\mathcal O(n)\)。
源代码:
#include<cmath>
#include<cstdio>
#include<cctype>
#include<climits>
#include<algorithm>
inline int getint() {
register char ch;
while(!isdigit(ch=getchar()));
register int x=ch^'0';
while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0');
return x;
}
typedef long long int64;
const int N=1e6+2;
int n,k,h[N],stk[N],top;
int64 f[N],sum[N],psum[N];
inline int64 calc(const int &j,const int &i,int64 x) {
const int64 a=i-j-1;
const int64 b=-2*(sum[i-1]-sum[j])-(i!=n+1?k:0)-(j!=0?k:0);
const int64 c=psum[i-1]-psum[j]+(i!=n+1?1ll*k*h[i]:0)+(j!=0?1ll*k*h[j]:0);
x=std::max(x,(int64)round(-1.*b/a/2));
x=std::min(x,1ll*std::min(h[i],h[j]));
return a*x*x+b*x+c;
}
int main() {
n=getint(),k=getint();
h[0]=h[n+1]=INT_MAX;
for(register int i=1;i<=n;i++) {
h[i]=getint();
sum[i]=sum[i-1]+h[i];
psum[i]=psum[i-1]+1ll*h[i]*h[i];
}
for(register int i=1;i<=n+1;i++) {
f[i]=f[i-1]+(2<=i&&i<=n?1ll*std::abs(h[i]-h[i-1])*k:0);
for(;top>=0&&h[stk[top]]<=h[i];top--) {
if(top!=0) {
const int &j=stk[top-1],&k=stk[top];
f[i]=std::min(f[i],f[j]+calc(j,i,h[k]));
}
}
stk[++top]=i;
}
printf("%lld\n",f[n+1]);
return 0;
}
[BZOJ2650]积木的更多相关文章
- codevs 3288 积木大赛
题目描述 Description 春春幼儿园举办了一年一度的"积木大赛".今年比赛的内容是搭建一座宽度为 n 的大厦,大厦可以看成由 n 块宽度为1的积木组成,第i块积木的最终高度 ...
- 洛谷P2409 Y的积木
P2409 Y的积木 77通过 491提交 题目提供者zhouyonglong 标签云端评测 难度普及+/提高 提交 讨论 题解 最新讨论 这组数据几乎可以卡掉所有程- 第一个题解有点问题 求教大 ...
- NOIP2013积木大赛
题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...
- vijos1059 积木城堡[n年浙江省队第X轮](背包的方案总数 or 01背包)
描述 XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大, ...
- noip2013 积木大赛
题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...
- BZOJ 1109: [POI2007]堆积木Klo
1109: [POI2007]堆积木Klo Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 948 Solved: 341[Submit][Statu ...
- [NOIP2013] 提高组 洛谷P1969 积木大赛
题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...
- NOIp 2013 #1 积木大赛 Label:有趣的模拟
题目描述 春春幼儿园举办了一年一度的“积木大赛”.今年比赛的内容是搭建一座宽度为n的大厦,大厦可以看成由n块宽度为1的积木组成,第i块积木的最终高度需要是hi. 在搭建开始之前,没有任何积木(可以看成 ...
- UVa 101 - The Blocks Problem(积木问题,指令操作)
题目来源:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&pa ...
随机推荐
- phantomjs 下拉滚动条获取网页的全部源码
//codes.js var system = require('system'); var fs = require("fs"); //console.log('Loading ...
- tomcat jsp页面乱码解决
浏览器接收服务器响应的中文参数: JSP页面中告诉浏览器使用什么编码: <%@ page language="java" contentType="text/htm ...
- sqlserver2008r2通过发布和订阅的方式进行数据库同步
发布服务器:192.168.8.16 订阅服务器:192.168.8.92 发布服务器配置: 选择需要发布的数据库,这里是Attendace_new 订阅服务器配置: 在订阅服务器上新建一个数据库:d ...
- Java的初始化执行顺序(父类static变量->子类static变量->父类成员变量->父类构造器->成员变量->构造器->main函数)
1. 引言 了解Java初始化的顺序,有助于理解Java的初始化机制和内存机制. 顺序:父类static变量->子类static变量->父类成员变量->父类构造器->成员变量- ...
- python-找出100以内的质数
质数:就是只能被1和本身整除的数,1除外,如2,3,5,7,11,13等等 ##求一百以内的质数(1和本身除尽的数)if __name__ == '__main__': list=[] flag=Fa ...
- 了解的CAP和BASE等理论
CAP,BASE和最终一致性是NoSQL数据库存在的三大基石.而五分钟法则是内存数据存储的理论依据.这个是一切的源头. 几个名词解释: 网络分区:俗称“脑裂”.当网络发生异常情况,导致分布式系统中部分 ...
- css之margin
参考地址:http://www.imooc.com/learn/680 标准盒模型 元素尺寸 可视尺寸-clientWidth(标准)——就是上图中的border box包含的尺寸. 占据尺寸-out ...
- 【前端】JS文本比较插件
一.先上效果图 二.JS代码 /** * [文本比较插件] * 传递两个参数dom1.dom2,以dom1为基准进行比较. * 0)dom1和dom2不能都为空: * 1)如果dom1不存在,则dom ...
- excel导出的时候从程序后台写到excel里的是文本,所以无法在excel中计算怎么办?
文章引用自:http://www.cnblogs.com/rayray/p/3414452.html excel导出的时候从程序后台写到excel里的是文本,所以无法在excel中计算怎么办? 需要导 ...
- 关于引用外部类要用static 的问题
一.直接用 static 引用 import static net.mindview.util.Print.*; //net...为引用的类,此方法在程序加载时就已实例化 二. 也可以手动在需要时实例 ...