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 ...
随机推荐
- Linux 的基本操作(系统用户及用户组的管理)
[认识/etc/passwd和/etc/shadow] 这两个文件可以说是linux系统中最重要的文件之一.如果没有这两个文件或者这两个文件出问题,则你是无法正常登录linux系统的. /etc/pa ...
- str、tuple、dict之间的相互转换
字符串.字典.元祖之间的相互转换: 1.字符串与列表之间的转换 str1 = 'ADMINphuang' '''str--->list''' list1=str1.split('p') prin ...
- Codeforces 584 - A/B/C/D/E - (Done)
链接:https://codeforces.com/contest/584 A - Olesya and Rodion - [水] 题解:注意到 $t$ 的范围是 $[2,10]$,对于位数小于 $2 ...
- 《Redis 优化》
一:管道技术 - 由于 redis 和 客户端是使用 TCP 连接的,那么在使用中就会产生往返耗时. - 虽然可能单条影响并不大,但是如果执行较多的命令会对性能产生影响. - 使用管道原理和 keep ...
- 深度学习基础(一)LeNet_Gradient-Based Learning Applied to Document Recognition
作者:Yann LeCun,Leon Botton, Yoshua Bengio,and Patrick Haffner 这篇论文内容较多,这里只对部分内容进行记录: 以下是对论文原文的翻译: 在传统 ...
- grep匹配字符串
基本正则表达式 元数据 意义和范例 ^word 搜寻以word开头的行. 例如:搜寻以#开头的脚本注释行 grep –n ‘^#’ regular.txt word$ 搜寻以word结束的行 例如,搜 ...
- python基础之 列表,元组,字典
other help(str.strip) #查看是否有返回值以及返回值类型[] :称为索引操作符 1.列表 列表相比字符串来说能存储大量数据的python的基本数据类型,并且也拥有字符串的一些方法( ...
- abap 断言
1: Assert equal http://www.saptechnical.com/Tutorials/OOPS/ABAPUnit/Index.htm
- Python数据分析与挖掘常用模块
python在数据科学方面需要用到的库: a.Numpy:科学计算库.提供矩阵运算的库. b.Pandas:数据分析处理库 c.scipy:数值计算库.提供数值积分和常微分方程组求解算法.提供了一个非 ...
- 你不知道的JavaScript-1.作用域是什么
作用域是一套规则,用于确定在何处以及如何查找变量.函数等(标识符).如果查找的目的是对变量进行赋值,那么就会使用 LHS 查询:如果目的是获取变量的值,就会使用 RHS 查询. 赋值操作符会导致 LH ...