#李超线段树 or 斜率优化+CDQ分治#洛谷 4655 [CEOI2017]Building Bridges
分析
列出方程即为\(dp[i]=\min\{dp[j]+(h[i]-h[j])^2+s[i-1]-s[j]\}\)
\(dp[j]+h[j]^2-s[j]=2*h[i]*h[j]+dp[i]-s[i-1]-h[i]^2\)
那这就是一个斜率为\(2*h[i]\),截距为\(dp[i]-s[i-1]-h[i]^2\)的直线
那要使截距尽量小,考虑用李超线段树解决
否则由于\(h[i]\)不具有单调性,考虑CDQ分治,第一维是时间,第二维是\(h\),斜率优化做
代码(李超线段树)
#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
typedef long long lll;
const int N=100011,M=1000011;
struct rec{lll a,b;}line[N];
lll h[N],s[N],dp[N]; int p[N*40],n;
inline signed iut(){
rr int ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
inline void print(lll ans){
if (ans<0) putchar('-'),ans=-ans;
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline lll calc(int t,int x){return line[t].a*x+line[t].b;}
inline signed either(int t1,int t2,int x){return calc(t1,x)<calc(t2,x)?t1:t2;}
inline void update(int k,int l,int r,int x,int y,int z){
rr int mid=(l+r)>>1;
if (x<=l&&r<=y){
if (!p[k]) {p[k]=z; return;}
rr lll la=calc(p[k],l),lb=calc(z,l);
rr lll ra=calc(p[k],r),rb=calc(z,r);
if (la<=lb&&ra<=rb) return;
if (la>=lb&&ra>=rb){p[k]=z; return;}
rr double pos=(line[p[k]].b-line[z].b)*1.0/(line[z].a-line[p[k]].a);
if (la>=lb){
if (pos<=mid) update(k<<1,l,mid,x,y,z);
else update(k<<1|1,mid+1,r,x,y,p[k]),p[k]=z;
}else{
if (pos>mid) update(k<<1|1,mid+1,r,x,y,z);
else update(k<<1,l,mid,x,y,p[k]),p[k]=z;
}
return;
}
if (x<=mid) update(k<<1,l,mid,x,y,z);
if (mid<y) update(k<<1|1,mid+1,r,x,y,z);
}
inline signed query(int k,int l,int r,int x){
if (l==r) return p[k];
rr int mid=(l+r)>>1;
if (x<=mid) return either(p[k],query(k<<1,l,mid,x),x);
else return either(p[k],query(k<<1|1,mid+1,r,x),x);
}
signed main(){
n=iut(),line[0]=(rec){0,1000000000000000000ll};
for (rr int i=1;i<=n;++i) h[i]=iut();
for (rr int i=1;i<=n;++i) s[i]=s[i-1]+iut();
dp[1]=0,line[1]=(rec){-h[1]<<1,h[1]*h[1]-s[1]},update(1,0,M,0,M,1);
for (rr int i=2;i<=n;++i){
dp[i]=h[i]*h[i]+s[i-1]+calc(query(1,0,M,h[i]),h[i]);
line[i]=(rec){-h[i]<<1,dp[i]+h[i]*h[i]-s[i]},update(1,0,M,0,M,i);
}
return !printf("%lld",dp[n]);
}
代码(斜率优化)
#include <cstdio>
#include <cctype>
#include <cstring>
#include <algorithm>
#define rr register
using namespace std;
typedef long long lll;
const int N=100011; const lll inf=1ll<<60;
int X[N],h[N],a[N],n,b[N],q[N]; lll s[N],dp[N],Y[N];
inline signed iut(){
rr int ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
inline lll O(int x){return 1ll*x*x;}
inline lll min(lll a,lll b){return a<b?a:b;}
bool cmp(int x,int y){return h[x]<h[y];}
inline double slope(int i,int j){return (X[i]==X[j])?(Y[j]>=Y[i]?inf:-inf):((double)(Y[j]-Y[i])/(X[j]-X[i]));}
inline void cdq(int l,int r){
if (l==r){
Y[a[l]]=dp[a[l]]+O(h[a[l]])-s[a[l]];
return;
}
rr int mid=(l+r)>>1,i1=l,j1=mid+1;
for (rr int i=l;i<=r;++i)
if (a[i]<=mid) b[i1++]=a[i];
else b[j1++]=a[i];
for (rr int i=l;i<=r;++i) a[i]=b[i];
cdq(l,mid);
rr int head=1,tail=0,t=l-1;
for (rr int i=l;i<=mid;++i){
while (head<tail&&slope(q[tail-1],q[tail])>=slope(q[tail],a[i])) --tail;
q[++tail]=a[i];
}
for (rr int i=mid+1,I=a[i];i<=r;I=a[++i]){
while (head<tail&&slope(q[head],q[head+1])<=2*h[I]) ++head;
if (head<=tail) dp[I]=min(dp[I],dp[q[head]]+O(h[I]-h[q[head]])+s[I-1]-s[q[head]]);
}
cdq(mid+1,r);
for (i1=l,j1=mid+1;i1<=mid&&j1<=r;)
if (X[a[i1]]<X[a[j1]]) b[++t]=a[i1++];
else b[++t]=a[j1++];
while (i1<=mid) b[++t]=a[i1++];
while (j1<=r) b[++t]=a[j1++];
for (rr int i=l;i<=r;++i) a[i]=b[i];
}
signed main(){
n=iut(),memset(dp,0x3f,sizeof(dp));
for (rr int i=1;i<=n;++i) h[i]=iut();
for (rr int i=1;i<=n;++i) s[i]=s[i-1]+iut();
for (rr int i=1;i<=n;++i) X[i]=h[i],a[i]=i;
sort(a+1,a+1+n,cmp),dp[1]=0,cdq(1,n);
return !printf("%lld",dp[n]);
}
#李超线段树 or 斜率优化+CDQ分治#洛谷 4655 [CEOI2017]Building Bridges的更多相关文章
- 洛谷.4655.[CEOI2017]Building Bridges(DP 斜率优化 CDQ分治)
LOJ 洛谷 \(f_i=s_{i-1}+h_i^2+\min\{f_j-s_j+h_j^2-2h_i2h_j\}\),显然可以斜率优化. \(f_i-s_{i-1}-h_i^2+2h_ih_j=f_ ...
- 【BZOJ3672】【NOI2014】购票(线段树,斜率优化,动态规划)
[BZOJ3672][NOI2014]购票(线段树,斜率优化,动态规划) 题解 首先考虑\(dp\)的方程,设\(f[i]\)表示\(i\)的最优值 很明显的转移\(f[i]=min(f[j]+(de ...
- BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治
BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治 Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM) ...
- 「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数
「线段树」「单点修改」洛谷P1198 [JSOI2008]最大数 题面描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数, ...
- [Noi2014]购票 BZOJ3672 点分治+斜率优化+CDQ分治
Description 今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.全国的城市构成了一棵以SZ市为根的有根树,每个城市与它的 ...
- 【BZOJ-1492】货币兑换Cash DP + 斜率优化 + CDQ分治
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 3396 Solved: 1434[Submit][Sta ...
- BZOJ3963 WF2011MachineWorks(动态规划+斜率优化+cdq分治)
按卖出时间排序后,设f[i]为买下第i台机器后的当前最大收益,则显然有f[i]=max{f[j]+gj*(di-dj-1)+rj-pi},且若此值<0,应设为-inf以表示无法购买第i台机器. ...
- bzoj1492/luogu4027 货币兑换 (斜率优化+cdq分治)
设f[i]是第i天能获得的最大钱数,那么 f[i]=max{在第j天用f[j]的钱买,然后在第i天卖得到的钱,f[i-1]} 然后解一解方程什么的,设$x[j]=\frac{F[j]}{A[j]*Ra ...
- [BZOJ1492][NOI2007]货币兑换Cash(斜率优化+CDQ分治)
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 5838 Solved: 2345[Submit][Sta ...
- 【BZOJ2726】[SDOI2012]任务安排 斜率优化+cdq分治
[BZOJ2726][SDOI2012]任务安排 Description 机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若 ...
随机推荐
- Git 分支管理参考模型
一个值得参考的Git分支管理模型如下: master 生产主分支,发布到生产环境使用这个分支,由hotfix或者release分支合并过来,不直接提交代码. release 预发布分支, 基于feat ...
- Apple设备屏幕尺寸和方向
表格中包括了各种型号的iPad.iPhone.以及iPod touch等设备的详细信息,涵盖了从iPad Pro到各代iPhone和iPod touch的多个型号. 这些信息可用于开发应用程序时优化界 ...
- 【LeetCode剑指offer 02】矩阵中的路径(老鼠走迷宫plus,应用深度优先搜索与回溯机制)
矩阵中的路径 https://leetcode.cn/problems/ju-zhen-zhong-de-lu-jing-lcof/ 给定一个 m x n 二维字符网格 board 和一个字符串单词 ...
- 03、Etcd 客户端常用命令
上一讲我们安装 etcd 服务端,这一讲我们来一起学学如何使用 etcd 客户端常见的命令.文章内容来源于参考资料,如若侵权,请联系删除,谢谢. etcd可通过客户端命令行工具 etcdctl 对et ...
- 第123篇: JS函数属性与方法
好家伙,本篇为<JS高级程序设计>第十章"函数"学习笔记 ECMAScript 中的函数是对象,因此有属性和方法. 1.函数属性 每个函数都有两个属性:length 和 ...
- 【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常
问题描述 在Java项目中,使用Redisson作为连接Redis的客户端,间歇性的出现了DNS Monitor throwable 错误. DNSMonitor throwable="ja ...
- 【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
问题描述 在App Service for Linux环境中,部署Django应用,访问应用页面时候,出现css.js等静态资源文件加载失败问题. 浏览器Console提示的错误消息为: Refuse ...
- 【Azure 环境】前端Web通过Azure AD获取Token时发生跨域问题(CORS Error)
问题描述 前端Web在开发时使用Azure AD中注册Application的方式进行Token获取,遇到了CORS遇到的问题(如下图).随后在AAD增加了单页应用的重定向URL, 依旧还是出现COR ...
- centos 目录磁盘使用情况
最简单的查看方法可以使用ls -ll.ls-lh命令进行查看,当使用ls -ll,会显示成字节大小,而ls- lh会以KB.MB等为单位进行显示,这样比较直观一些. 通过命令du -h –max- ...
- ImageClipboard js粘贴剪切板图片,已测试,可用,可获得base64
ImageClipboard js粘贴剪切板图片,已测试,可用,可获得base64 具体用到自己项目的时候,拿源码改成自己的库,从写一遍 3个小问题 onpaste 执行了两遍,一次是图片加载完成,一 ...