loj#2483. 「CEOI2017」Building Bridges 斜率优化 cdq分治
loj#2483. 「CEOI2017」Building Bridges
链接
思路
\]
\]
\]
\]
\]
\]
然后cdq维护一下凸包
细节
首先按照k排序(k是已知的),保证询问不再二分凸包(\(log^2n\))而是使用单调队列(\(logn\))。
计算斜率的函数一定要写好了。
还有最后按照x排序的函数也要一起写好。
会受影响的
大体流程
if(l==r) return;
按照mid把p分成两半
cdq(l,mid)
建立左边的凸包
左边的凸包更新右边的答案
cdq(mid+1,r)
按照x排序p
ps:p就是个结构体存很多东西
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=2e5+7;
const ll inf=0x3f3f3f3f3f3f3f3f;
ll read() {
ll x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
ll n,h[N],sum[N],f[N];
struct node {
ll k,x,y,id;
bool operator < (const node &b) const {
return k<b.k;
}
}q[N],t[N];
ll stak[N],top;
double get_k(ll a,ll b) {
if(!b) return inf;
if(q[a].x==q[b].x) return q[a].y<=q[b].y?inf:-inf;
return 1.0*(q[a].y-q[b].y)/(q[a].x-q[b].x);
}
void solve(ll l,ll r) {
if(l==r) {
q[l].y=f[l]+h[l]*h[l]-sum[l];
return;
}
ll mid=(l+r)>>1,l1=l,l2=mid+1;
//sort q according to id
for(ll i=l;i<=r;++i) {
if(q[i].id<=mid) t[l1++]=q[i];
else t[l2++]=q[i];
}
for(ll i=l;i<=r;++i) q[i]=t[i];
solve(l,mid);
//build a convex hull on the left
top=0;
for(ll i=l;i<=mid;++i) {
while(top>1&&get_k(stak[top-1],stak[top])>get_k(stak[top-1],i)) top--;
stak[++top]=i;
}
stak[++top]=0;
//update ans on the right
for(ll dsr=mid+1,DSR=1;dsr<=r;++dsr) {
while(DSR<top&&get_k(stak[DSR],stak[DSR+1])<q[dsr].k)
DSR++;
ll i=q[dsr].id,j=q[stak[DSR]].id;
f[i]=min(f[i],f[j]+(h[i]-h[j])*(h[i]-h[j])+sum[i-1]-sum[j]);
}
solve(mid+1,r);
//sort q according to x
l1=l,l2=mid+1;
for(ll i=l;i<=r;++i) {
if(((q[l1].x<q[l2].x||(q[l1].x==q[l2].x&&q[l1].y<q[l2].y)||l2>r))&&l1<=mid) t[i]=q[l1++];
// if(((p[l1].x<p[l2].x||(fabs(p[l1].x-p[l2].x)<eps&&p[l1].y<p[l2].y)||l2>r))&&l1<=mid)
else t[i]=q[l2++];
}
for(ll i=l;i<=r;++i) q[i]=t[i];
}
int main() {
n=read();
for(ll i=1;i<=n;++i) h[i]=read();
for(ll i=1;i<=n;++i) sum[i]=sum[i-1]+read();
for(ll i=1;i<=n;++i) q[i].x=h[i],q[i].k=2*h[i],q[i].id=i;
memset(f,0x3f,sizeof(f));f[1]=0;
sort(q+1,q+1+n);
solve(1,n);
printf("%lld\n",f[n]);
return 0;
}
loj#2483. 「CEOI2017」Building Bridges 斜率优化 cdq分治的更多相关文章
- @loj - 2483@「CEOI2017」Building Bridges
目录 @desription@ @solution@ @accepted code@ @details@ @another solution@ @another code@ @desription@ ...
- 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就过了 ...
- LOJ 2483: 洛谷 P4655: 「CEOI2017」Building Bridges
题目传送门:LOJ #2483. 题意简述: 有 \(n\) 个数,每个数有高度 \(h_i\) 和价格 \(w_i\) 两个属性. 你可以花费 \(w_i\) 的代价移除第 \(i\) 个数(不能移 ...
- BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治
BZOJ_3963_[WF2011]MachineWorks_斜率优化+CDQ分治 Description 你是任意性复杂机器公司(Arbitrarily Complex Machines, ACM) ...
- 洛谷.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_ ...
- 【BZOJ-1492】货币兑换Cash DP + 斜率优化 + CDQ分治
1492: [NOI2007]货币兑换Cash Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 3396 Solved: 1434[Submit][Sta ...
- BZOJ.1492.[NOI2007]货币兑换(DP 斜率优化 CDQ分治/Splay)
BZOJ 洛谷 如果某天能够赚钱,那么一定会在这天把手上的金券全卖掉.同样如果某天要买,一定会把所有钱花光. 那么令\(f_i\)表示到第\(i\)天所拥有的最多钱数(此时手上没有任何金券),可以选择 ...
- 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 ...
随机推荐
- 动态获取移动端视宽,从而结合rem达到适配
// jq !function(){ var windowWidth= $(window).width(); if(windowWidth > 750) { windowWidth = 750; ...
- python的time
有时候需要获取并格式化输出把当前时间,需要用到datetime的strftime方法 >>from datetime import datetime >>datetime.no ...
- Oracle课程档案,第十六天
restore:恢复文件 recover: 恢复日志 丢失current日志组(正常关闭数据库):故障:SQL> select group#, status from v$log; 确认curr ...
- python 字符类型
1.整型 int 短整型在window中是2**30--2**39 长整型 long 在python中不区分长短 2.浮点数 float 一般是小数 3.复数 4.boolen类型(布尔类型) 运算结 ...
- Luogu 1023 - 税收与补贴问题 - [数学题]
题目链接:https://www.luogu.org/problemnew/show/P1023 题目背景每样商品的价格越低,其销量就会相应增大.现已知某种商品的成本及其在若干价位上的销量(产品不会低 ...
- vim创建程序文件自动添加头部注释/自动文件头注释与模板定义
Vim 自动文件头注释与模板定义 在vim的配置文件.vimrc添加一些配置可以实现创建新文件时自动添加文件头注释,输入特定命令可以生成模板. 使用方法 插入模式输入模式输入seqlogic[Ente ...
- Python解析Linux命令行
写了个python脚本在linux需要传入参数使用,python参数传入有几个方法, 先用了Python中命令行参数的最传统的方法sys.argv linux cmd ~& python ma ...
- layui上传文件前端报404,实际文件已经上传成功
原因:上传回调的方法接收的参数应该是json格式的,之前返回的是String,所以一直走异常的方法 第一种 在后台上加上@ResponseBody 第二种 @ResponseBody @Request ...
- sql server创建windows账户
--不要干坏事 sql server中使用xp_cmdshell --1.允许配置高级选项 GO RECONFIGURE GO --2.开启xp_cmdshell服务 RECONFIGURE GO - ...
- Apache 2.4.27外网访问403(Forbidden)错误
httpd.conf <Directory /> AllowOverride none #Require all denied 注释这句 Allow from all Require al ...