当前位置: 首页 > news >正文

[CEOI2017] Building Bridges 题解

[CEOI2017] Building Bridges

1.题目大意

\(n\)根柱子,每根柱子有个高度\(h_i\),有若干座桥,一座连接柱子\(i\)\(j\)的桥建造它需要\((h_i-h_j)^2\)的代价。

要求连接\(1\)\(n\)的所有柱子。但是用不到的柱子全要被拆除,拆除第\(i\)根柱子的代价为\(w_i\)

2.DP设计与优化思路

十分简单

为了方便表示,设\(s_i=\sum_{j=1}^{i}w_j\)

\(dp_i\)为将第一根柱子通过不同的连接方案连接上第\(i\)根柱子的最小代价,这个状态很好转移,就像这样:

\[dp_i=\min\limits_{j=1}^{i-1} \{dp_j+(h_i-h_j)^2+s_i-s_{j}\} \]

这个转移是\(O(n^2)\)的,此时,我们想起之前学过斜率优化DP,发现这个式子似乎可以拆成如下的形式:

\[dp_i=\min\limits_{j=1}^{i-1} \{dp_j+h_j^2-s_j-2h_ih_j\}+h_i^2+s_i \]

观察\(min\)内的柿子,这个式子可以变为如\(kx+b\)的形式

\(k=-2h_j\)\(b=dp_j+h_j^2-s_j\),再把\(min\)括号内的\(h_i\)看作\(x\)

那就化成了如下的形式:

\[dp_i=\min\limits_{j=1}^{i-1} \{kh_i+b\}+h_i^2+s_i \]

问题就转化为了:有\(i-1\)条直线,求所有直线中与\(x=h_i\)这条直线相交的点\(y\)坐标最低的直线

这道题的DP没有单调性,但是我们有数据结构:李超线段树

于是,每次按照\(k=-2h_j\)\(b=dp_j+h_j^2-s_j\)插入每条线段,查询最低点就行了。

思路还是比较套路的,可以用到许多其他类似的DP上

3.警示后人

如果你把所有区间的优势线段初始化为\(0\),请设置第\(0\)个线段的值为极大值

4.Code

#include<bits/stdc++.h>
#define int long long
#define ls (k<<1)
#define rs (k<<1|1)
using namespace std;
const int mod1=39989,mod2=1e9;
struct no{int k,b;
}ln[2000010];
int rt[2000010],cnt;
int gsum(int id,int val){return ln[id].k*val+ln[id].b;
}
void add(int k,int b){ln[++cnt]={k,b};
}
int cmp(int a,int b){if(a-b>0)return 1;if(b-a>0)return -1;return 0;
}
void change(int k,int l,int r,int pos){int &tmp=rt[k],mid(l+r>>1);int op2=cmp(gsum(pos,mid),gsum(tmp,mid));if(op2==-1 or (op2==0 and pos<tmp))swap(tmp,pos);int op1=cmp(gsum(pos,l),gsum(tmp,l));int op3=cmp(gsum(pos,r),gsum(tmp,r));if(op1==-1 or (op1==0 and pos<tmp))change(ls,l,mid,pos);if(op3==-1 or (op3==0 and pos<tmp))change(rs,mid+1,r,pos);
}pair<int,int> mxp(pair<int,int>a,pair<int,int>b){if(cmp(a.first,b.first)==1)return b;if(cmp(a.first,b.first)==-1)return a;return a.second<b.second ? a:b;
}
pair<int,int>query(int k,int l,int r,int val){if(r<val or val<l)return {1e18,1e18};int mid(l+r>>1);//cout<<l<<" "<<r<<" "<<val<<endl;int now=gsum(rt[k],val);if(l==r)return {now,rt[k]};return mxp({now,rt[k]},mxp(query(ls,l,mid,val),query(rs,mid+1,r,val)));
}
int n,h[200010],w[200010],f[200010];
main(){cin>>n;for(int i=1;i<=n;i++)cin>>h[i];for(int i=1;i<=n;i++)cin>>w[i],w[i]+=w[i-1];ln[0].b=1e18;add(-2*h[1],h[1]*h[1]-w[1]);change(1,0,1000000,cnt);//cout<<1;for(int i=2;i<=n;i++){f[i]=h[i]*h[i]+w[i-1]+query(1,0,1000000,h[i]).first;//cout<<i<<endl;add(-2*h[i],f[i]+h[i]*h[i]-w[i]);change(1,0,1000000,cnt);}cout<<f[n];return 0;
} 
http://www.jsqmd.com/news/362025/

相关文章:

  • 研究生必看!抢手爆款的降AIGC平台 —— 千笔
  • 2026 天津英语雅思培训教育机构推荐,雅思培训课程中心权威口碑榜单 - 老周说教育
  • 2026年知名的医疗电子HDI线路板,任意层HDI线路板,工业控制类HDI线路板厂家推荐榜 - 品牌鉴赏师
  • 详细介绍:2026年如何选择你的Linux Server发行版
  • 2026年房产继承律师推荐:家庭纠纷场景深度评价,解决遗嘱效力与产权认定痛点 - 品牌推荐
  • 2026年北京美度手表维修推荐榜单:非官方维修点评测与售后网点选择指南 - 品牌推荐
  • 基于周立功USB-CAN设备的C#开发方案
  • 《人月神话》阅读笔记2
  • 2026年房产继承律师推荐:财富传承趋势专业评测,涵盖涉外与拆迁房继承场景痛点 - 品牌推荐
  • 合肥三十六行哈尔滨分公司 全平台赋能冰城本地生活 - 野榜数据排行
  • 常用的 JPG 转 PNG 在线工具盘点(免费、支持批量)
  • 2026年完整性测试仪/过滤器完整性测试仪/手套完整性测试仪/RTP完整性测试仪/滤芯完整性测试仪生产厂家最新推荐权威榜 - 品牌推荐大师1
  • 2026西南公装价值赋能指南 办公室/茶楼/商业/餐饮装修实力品牌甄选 - 深度智识库
  • 建议收藏|8个一键生成论文工具测评:研究生毕业论文+科研写作效率全解析
  • 2026年深圳公司法律师推荐:权威评测与选型避坑全指南 - 品牌推荐
  • Java/Go/Python 实现内网环境下的企微 API 代理转发与隧道技术
  • 【西工大主办、SAE独立出版、EI稳定检索】第二届航空航天工程与材料技术国际会议(AEMT 2026)
  • 基于VMD信号分解算法的光伏功率分析及滚动轴承故障检测与混合储能优化
  • 2026年维普论文降AI率用什么工具好?实测5款后选了这个
  • OpenCSG 正式发布 OpenClaw AgenticHub 企业级 OPC 平台
  • 2026最新版超星学习通下载与安装详解:从环境配置到多端使用全流程指南
  • 2026 郑州英语雅思培训教育机构推荐;雅思培训课程中心权威口碑榜单 - 老周说教育
  • 【耿直哥机器学习】14-4-隐马尔可夫模型代码实现
  • 2026国内最新方便食品良心品牌top5推荐!优质方便食品厂家权威榜单发布,适配露营/居家/旅行/出差多场景 - 品牌推荐2026
  • 2026年维普论文降AI率实测:用降AI工具从70%降到8%
  • 2026年北京罗杰杜彼手表维修推荐榜单:非官方维修网点服务评测与选择指南 - 品牌推荐
  • 2026年冷却塔厂家权威推荐:开式/闭式冷却塔,散热与节能深度解析 - 深度智识库
  • AI驱动的漏洞治理革命:从模式识别到自动修复的闭环实践
  • 尊尼获加:改变世界节奏的人
  • 2026 郑州英语雅思培训教育机构推荐:雅思培训课程中心权威口碑榜单 - 老周说教育