#李超线段树 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个任务被分成若 ...
随机推荐
- FastGateway 发布v0.0.0.5
FastGateway 发布v0.0.0.5 修复构建错误 修复docker-compose执行目录 修改请求来源分析数据列表展示 update README.md. 增加默认证书 修复构建脚本目录错 ...
- 如何配置WebStorm开发Chrome插件项目
开发Chrome插件项目,在调用Chrome的相关接口时,默认情况下WebStorm是不会有任何提示的,这对于开发者特别是新手特别不友好. 因此,需要IDE能支持Chrome接口调用时的智能提示. 如 ...
- Windows系统下的输入法选择
总共用过5款输入法:搜狗拼音输入法,QQ拼音输入法,谷歌拼音输入法,手心输入法,小狼毫. 搜狗输入法功能最强大,词库也很全,基本上对于盲打的输入纠错很准确,但是因为后台会启动多个服务,会占很多内存资源 ...
- defaultdict高级用法
说明 defaultdict数据结构允许调用者提供一个函数,用来在键名缺失的情况下,创建与这个 键对应的值.只要字典发现调用者想要访问的键不存在,就会触发这个函数,以返回应该 与键相关联的默认值 下面 ...
- Django关于StreamingHttpResponse与FileResponse响应文件或视频的下载请求
StreamingHttpResponse from django.http import StreamingHttpResponse StreamingHttpResponse(streaming_ ...
- pep8相关规范
https://www.jianshu.com/p/ffcc66bab3ce 导包规范: 1.首先是标准库,如 import os 2.然后是第三方库,如 from django.conf impor ...
- sql注入简单初
import requests,sys,time from PyQt5.QtWidgets import * from PyQt5.QtGui import QIcon from threading ...
- 框架和MVC架构
网络框架及MVC架构 网络框架 所谓网络框架是指这样的一组Python包,它能够使开发者专注于网站应用业务逻辑的开发,而无须处理网络应用底层的协议.线程.进程等方面.这样能大大提高开发者的工作效率,同 ...
- 启动Study.BlazorOne项目
由于Study.Trade模块的Blazor是基于国内著名的BootstrapBlazor组件,因此Study.BlazorOne项目也必须添加对BootstrapBlazor的支持. # 1.去Bo ...
- [manjaro linux] 安装完成之后的配置工作,以及常用软件的安装
emmm 很久没有更新了,绝对不是丢掉了博客帐号,有时间还是要好好装饰以下博客的... https://zhuanlan.zhihu.com/p/114296129 看到很多过程 sudo pacma ...