Building Bridges

题目大意

连接两根柱子 \(i,j\) 的代价是 \((h_i-h_j)^2+\sum\limits_{k=j+1}^{i-1}w_k\),连接具有传递性,求将 \(1,n\) 连接的最小代价。

思路分析

斜率优化 DP 板题。

设 \(f_i\) 表示考虑到前 \(i\) 根柱子并强制选择第 \(i\) 根柱子的最小代价,所求即 \(f_n\)。则容易列出状态转移方程:

\[f_i=\min_{j<i}(f_j+(h_i-h_j)^2+\sum_{k=j+1}^{i-1}w_k)
\]

设 \(s\) 为 \(w\) 的前缀和,即 \(s_i=\sum\limits_{j=1}^iw_j\),则方程可化为:

\[f_i=\min_{j<i}(f_j+h_i^2-2h_ih_j+h_j^2+s_{i-1}-s_{j})
\]

然后是斜率优化经典操作:

\[\begin{aligned}f_i&=f_j+h_i^2-2h_ih_j+h_j^2+s_{i-1}-s_{j}\\f_i-h_i^2-s_{i-1}&=f_j+h_j^2-s_j-2h_ih_j\\(f_i-h_i^2-s_{i-1})&=(-2h_j)(h_i)+(f_j+h_j^2-s_j)\end{aligned}
\]

设:

\[\begin{cases}y=f_i-h_i^2-s_{i-1}\\k=-2h_j\\x=h_i\\b=f_j+h_j^2-s_j\end{cases}
\]

问题转化为每次插入一条 \(k_i=-2h_i,b_i=f_i+h_i^2-s_i\) 的直线,查询 \(x_i=h_i\) 的最值,用李超线段树优化即可。

代码

自我感觉马蜂可看。

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <algorithm> using namespace std;
const int N=100100,V=1001000;
#define int long long
#define mid ((l+r)>>1)
#define inf 0x3f3f3f3f3f3f3f3f int n;
int h[N],s[N],f[N]; struct Line{
int k,b;
}line[N]; int calc(int id,int x){
return line[id].k*x+line[id].b;
} bool Less(int id1,int id2,int x){//比较优劣
return calc(id1,x)<calc(id2,x);
} struct ST{//简洁的李超线段树
int a[V<<2];
void add(int p,int l,int r,int id){
if(l==r){if(Less(id,a[p],l)) a[p]=id;return ;}
if(Less(id,a[p],mid)) swap(a[p],id);
if(Less(id,a[p],l)) add(p<<1,l,mid,id);
if(Less(id,a[p],r)) add(p<<1|1,mid+1,r,id);
}
int query(int p,int l,int r,int x){
int res=calc(a[p],x);
if(l==r) return res;
if(x<=mid) res=min(res,query(p<<1,l,mid,x));
else res=min(res,query(p<<1|1,mid+1,r,x));
return res;
}
}tree; signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld",&h[i]);
for(int i=1;i<=n;i++){
scanf("%lld",&s[i]);
s[i]+=s[i-1];
}
line[0]={0,inf};//初始化第 0 条直线,保证空转移转移不到第 0 条上,也可以在 add 和 query 中特判空线段的情况,不过这样比较方便
line[1]=Line{-2*h[1],h[1]*h[1]-s[1]};//初始化第一条直线
tree.add(1,0,V,1);//加入第一条直线
for(int i=2;i<=n;i++){
f[i]=tree.query(1,0,V,h[i])+h[i]*h[i]+s[i-1];//查询,移项过去得 f[i]
line[i]=Line{-2*h[i],f[i]+h[i]*h[i]-s[i]};//新建直线
tree.add(1,0,V,i);//插入直线
}
cout<<f[n]<<'\n';
return 0;
}

Building Bridges 题解的更多相关文章

  1. 题解-[CEOI2017]Building Bridges

    [CEOI2017]Building Bridges 有 \(n\) 个桥墩,高 \(h_i\) 重 \(w_i\).连接 \(i\) 和 \(j\) 消耗代价 \((h_i-h_j)^2\),用不到 ...

  2. Luogu4655 [CEOI2017]Building Bridges

    Luogu4655 [CEOI2017]Building Bridges 有 \(n\) 根柱子依次排列,每根柱子都有一个高度.第 \(i\) 根柱子的高度为 \(h_i\) . 现在想要建造若干座桥 ...

  3. loj#2483. 「CEOI2017」Building Bridges 斜率优化 cdq分治

    loj#2483. 「CEOI2017」Building Bridges 链接 https://loj.ac/problem/2483 思路 \[f[i]=f[j]+(h[i]-h[j])^2+(su ...

  4. HDU 4584 Building bridges (水题)

    Building bridges Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) ...

  5. ceoi2017 Building Bridges(build)

    Building Bridges(build) 题目描述 A wide river has nn pillars of possibly different heights standing out ...

  6. LOJ 2483: 洛谷 P4655: 「CEOI2017」Building Bridges

    题目传送门:LOJ #2483. 题意简述: 有 \(n\) 个数,每个数有高度 \(h_i\) 和价格 \(w_i\) 两个属性. 你可以花费 \(w_i\) 的代价移除第 \(i\) 个数(不能移 ...

  7. POJ2749:Building roads——题解

    http://poj.org/problem?id=2749 (这个约翰的奶牛真多事…………………………) i表示u与s1连,i+n表示u与s2连. 老规矩,u到v表示取u必须取v. 那么对于互相打架 ...

  8. 洛谷 P2872 [USACO07DEC]道路建设Building Roads 题解

    P2872 [USACO07DEC]道路建设Building Roads 题目描述 Farmer John had just acquired several new farms! He wants ...

  9. Design Tip #142 Building Bridges

    http://www.kimballgroup.com/2012/02/design-tip-142-building-bridges/ The dominant topologies of Data ...

  10. loj#2483. 「CEOI2017」Building Bridges(dp cdq 凸包)

    题意 题目链接 Sol \[f[i], f[j] + (h[i] - h[j])^2 + (w[i - 1] - w[j]))\] 然后直接套路斜率优化,发现\(k, x\)都不单调 写个cdq就过了 ...

随机推荐

  1. 深入浅出security学习笔记

    第一章 导入web和security依赖,然后默认提供了一个基于内存的UserDetailsServiceAutoConfiguration如下 会读取写入的user配置,SecurityProper ...

  2. 如何使用libswscale库将YUV420P格式的图像序列转换为RGB24格式输出?

    一.视频格式转换初始化 将视频中的图像帧按照一定比例缩放或指定宽高进行放大和缩小是视频编辑中最为常见的操作之一,这里我们将1920x1080的yuv图像序列转换成640x480的rgb图像序列,并输出 ...

  3. 【原创】Ftrace使用及实现机制

    Ftrace使用及实现机制 版权声明:本文为本文为博主原创文章,转载请注明出处 https://www.cnblogs.com/wsg1100 如有错误,欢迎指正. 目录 Ftrace使用及实现机制 ...

  4. Java开发大型互联网-架构师必须掌握的分布式技术

    Java开发大型互联网-架构师必须掌握的分布式技术 摘要:在当今互联网行业,随着用户量和业务的不断增长,大型互联网系统的设计和开发已经成为了一项头等重要的任务.作为架构师,要能够应对这样的挑战,就必须 ...

  5. python数据处理:获取Dataframe中的一列或一行

    解决方案 df['w'] #选择表格中的'w'列,使用类字典属性,返回的是Series类型 df.w #选择表格中的'w'列,使用点属性,返回的是Series类型 df[['w']] #选择表格中的' ...

  6. MISC杂项解题思路

    首先拿到一个杂项的附件 第一步要判断 是什么类型的杂项题目 附件是什么内容 是图片? 是压缩包? 是磁盘文件? 还是其他未知的东西 第一步的判断能够直接将解题思路精准定位到正确的区域下 加快解题速度 ...

  7. Eolink 出席 QECon 大会,引领「AI+API」技术的革新浪潮

    7月28日-29日,第八届 QECon 质量效能大会在北京成功召开.大会聚焦"数生智慧,高质量发展新引擎",深入探讨如何利用数字化和智能化技术推动软件质量的发展,进而为高质量的经济 ...

  8. windows和linux键值表

    windows系统下对应键值 {8,KEY_BACKSPACE}, {9,KEY_TAB}, {13,KEY_ENTER}, {16,KEY_LEFTSHIFT}, {17,KEY_LEFTCTRL} ...

  9. 论文解读(WIND)《WIND: Weighting Instances Differentially for Model-Agnostic Domain Adaptation》

    Note:[ wechat:Y466551 | 可加勿骚扰,付费咨询 ] 论文信息 论文标题:WIND: Weighting Instances Differentially for Model-Ag ...

  10. The database operation was expected to affect 1 row(s), but actually affected 0 row(s); 解决乐观并发

    The database operation was expected to affect 1 row(s), but actually affected 0 row(s); 解决乐观并发 1.乐观并 ...