Building Bridges(build)

题目描述

A wide river has nn pillars of possibly different heights standing out of the water. They are arranged in a straight line from one bank to the other. We would like to build a bridge that uses the pillars as support. To achieve this we will select a subset of pillars and connect their tops into sections of a bridge. The subset has to include the first and the last pillar.

The cost of building a bridge section between pillars ii and jj is (hi−hj)2(hi−hj)2 as we want to avoid uneven sections, where hihi is the height of the pillar ii. Additionally, we will also have to remove all the pillars that are not part of the bridge, because they obstruct the river traffic. The cost of removing the i−thi−th pillar is equal to wiwi. This cost can even be negative—some interested parties are willing to pay you to get rid of certain pillars. All the heights hihi and costs wiwi are integers.

What is the minimum possible cost of building the bridge that connects the first and last pillar?

有 n 根柱子依次排列,每根柱子都有一个高度。第 i 根柱子的高度为 hi。

现在想要建造若干座桥,如果一座桥架在第 i 根柱子和第 j根柱子之间,那么需要 (hi−hj)^2 的代价。

在造桥前,所有用不到的柱子都会被拆除,因为他们会干扰造桥进程。第 i 根柱子被拆除的代价为 wi,注意 wi 不一定非负,因为可能政府希望拆除某些柱子。

现在政府想要知道,通过桥梁把第 1 根柱子和第 n 根柱子连接的最小代价。注意桥梁不能在端点以外的任何地方相交。

输入

The first line contains the number of pillars, nn.

The second line contains pillar heights hihi in the order, separated by a space.

The third line contains wiwi in the same order, the costs of removing pillars.

第一行一个正整数 n。

第二行 n 个空格隔开的整数,依次表示h1,h2,⋯,hnh1,h2,⋯,hn。

第三行 n 个空格隔开的整数,依次表示w1,w2,⋯,wnw1,w2,⋯,wn。

输出

Output the minimum cost for building the bridge. Note that it can be negative.

输出一行一个整数表示最小代价,注意最小代价不一定是正数。

样例输入

6
3 8 7 1 6 6
0 -1 9 1 2 0

样例输出

17

提示

Constraints

• 2 <= n <= 10^5

• 0 <= hi <= 10^6

• 0 <= |wi| <= 10^6

Subtask 1 (30 points)

• n <= 1, 000

Subtask 2 (30 points)

• optimal solution includes at most 2 additional pillars (besides the first and last) • |wi| <= 20

Subtask 3 (40 points)

• no additional constraints

来源

ceoi2017 day2


solution

把w前缀和起来

我们可以得到一个n^ 2 DP

把它写成斜率优化的形式

斜率不单调,x不单调。

不会splay,那就cdq分治。

把h排序,然后就是单调的了

构出凸包,斜率优化即可

吐槽:cdq细节真是多

注意算斜率时

有时是+inf (a.x==b.x&&a.y<b.y)

有时是-inf (a.x==b.x&&a.y>b.y)

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 100005
#define inf 1e18
using namespace std;
int n,num[22][maxn],top;
long long f[maxn];
struct node{
long long id,h,w;
}s[maxn],ss[maxn];
struct po{
long long x,y,id;
}h[maxn],zh[maxn];
void merge(int k,int l,int r){
if(l==r){num[k][l]=l;return;}
int mid=l+r>>1;
merge(k+1,l,mid);merge(k+1,mid+1,r);
int li=l,ri=mid+1;
for(int i=l;i<=r;i++){
if(li>mid){
num[k][i]=num[k+1][ri++];continue;
}
if(ri>r){
num[k][i]=num[k+1][li++];continue;
}
int v1=s[num[k+1][li]].h,v2=s[num[k+1][ri]].h;
if(v1<=v2)num[k][i]=num[k+1][li++];
else num[k][i]=num[k+1][ri++];
}
}
po xl(po a,po b){
po t;t.x=a.x-b.x,t.y=a.y-b.y;
return t;
}
long long cj(po a,po b){
return a.x*b.y-a.y*b.x;
}
void tb(int l,int r){
top=0;
for(int i=l;i<=r;i++){ po now;now.x=s[i].h,now.y=f[s[i].id]+s[i].h*s[i].h-s[i].w;now.id=s[i].id;
while(top>1&&cj(xl(zh[top],zh[top-1]),xl(now,zh[top]))<=0)top--;////
zh[++top]=now;
}
}
double getk(po a,po b){
if(a.x==b.x){
if(a.y>b.y)return -inf;
return inf;
}
double xx=a.x-b.x,yy=a.y-b.y;
return yy/xx;
}
void cdq(int k,int l,int r){
if(l==r)return;
int mid=l+r>>1;
cdq(k+1,l,mid);
for(int i=l;i<=mid;i++)s[i]=ss[num[k+1][i]]; tb(l,mid);
for(int i=mid+1;i<=r;i++)s[i]=ss[num[k+1][i]];
int fs=1;
for(int i=mid+1;i<=r;i++){
while(fs<top&&2*(double)s[i].h>getk(zh[fs],zh[fs+1]))fs++;
int j=zh[fs].id,ii=s[i].id;
f[ii]=min(f[ii],
f[j]+(ss[ii].h-ss[j].h)*(ss[ii].h-ss[j].h)+ss[ii-1].w-ss[j].w
);
}
for(int i=mid+1;i<=r;i++)s[i]=ss[i];
cdq(k+1,mid+1,r);
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)scanf("%lld",&s[i].h);
for(int i=1;i<=n;i++){
scanf("%lld",&s[i].w);
s[i].w+=s[i-1].w;
s[i].id=i;
ss[i]=s[i];
}
merge(1,1,n);
for(int i=2;i<=n;i++)f[i]=inf;
cdq(1,1,n);
cout<<f[n]<<endl;
return 0;
}

ceoi2017 Building Bridges(build)的更多相关文章

  1. Luogu4655 [CEOI2017]Building Bridges

    Luogu4655 [CEOI2017]Building Bridges 有 \(n\) 根柱子依次排列,每根柱子都有一个高度.第 \(i\) 根柱子的高度为 \(h_i\) . 现在想要建造若干座桥 ...

  2. 题解-[CEOI2017]Building Bridges

    [CEOI2017]Building Bridges 有 \(n\) 个桥墩,高 \(h_i\) 重 \(w_i\).连接 \(i\) 和 \(j\) 消耗代价 \((h_i-h_j)^2\),用不到 ...

  3. 洛谷.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_ ...

  4. [CEOI2017]Building Bridges

    题目 斜率优化思博题,不想写了 之后就一直\(95\)了,于是靠肮脏的打表 就是更新了一下凸壳上二分斜率的写法,非常清爽好写 就当是挂个板子了 #include<algorithm> #i ...

  5. loj#2483. 「CEOI2017」Building Bridges 斜率优化 cdq分治

    loj#2483. 「CEOI2017」Building Bridges 链接 https://loj.ac/problem/2483 思路 \[f[i]=f[j]+(h[i]-h[j])^2+(su ...

  6. HDU 4584 Building bridges (水题)

    Building bridges Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) ...

  7. @loj - 2483@「CEOI2017」Building Bridges

    目录 @desription@ @solution@ @accepted code@ @details@ @another solution@ @another code@ @desription@ ...

  8. 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就过了 ...

  9. LOJ 2483: 洛谷 P4655: 「CEOI2017」Building Bridges

    题目传送门:LOJ #2483. 题意简述: 有 \(n\) 个数,每个数有高度 \(h_i\) 和价格 \(w_i\) 两个属性. 你可以花费 \(w_i\) 的代价移除第 \(i\) 个数(不能移 ...

随机推荐

  1. javaweb基础(33)_jdbc的crud操作

    一.statement对象介绍 Jdbc中的statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可. Statement对象的exe ...

  2. C语言字符,字符串,字节操作常用函数

    strlen 这个函数是在 string.h 的头文件中定义的 它的函数原型是 size_t strlen( const char ); size_t 是一个无符号整型,是这样定义的 typedef ...

  3. axios使用思路总结

    一.Axios是什么?用来发送请求的对象,类似之前的ajax 二.如何使用? 目前只说get和post的使用方式.一共有两种. 直接使用配置项的方式,发送请求: 2.使用别名来发送请求 参考: htt ...

  4. JDBC 基本语法总结

    实现JDBC操作: 静态SQL执行 ① 注册驱动 Class.forName("com.mysql.jdbc.Driver"); ② 创建连接 Connection con = D ...

  5. c++ 中十进制 八进制 十六进制 二进制转换 最简方法

    #include<iostream> using namespace std; int main() { int i; cin>>dec>>i; //cin> ...

  6. matplotlib(二)——matplotlib控制坐标轴第一个刻度到原点距离

    一.问题描述 具体问题是: 用python库matplotlib进行数据的图表展示: 横坐标是自定义统计值: 保存矢量图(svg),保存后发现横坐的第一个点离坐标原点距离较大,导致图形离y轴较远,让画 ...

  7. php面向对象(2)构造和析构函数

    一.构造方法 构造方法是类中一个“特殊”的方法,作用是在实例化一个对象的同时,给该对象的属性赋值,使之创建完成的时就具有其本身的特有属性 该方法固定格式:[访问修饰符] function _const ...

  8. Python入门必学:字符串和编码正确的使用方法

    字符编码,我们已经讲过了,字符串也是一种数据类型,但是,字符串比较特殊的是还有一个编码问题. 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特 ...

  9. DiyCode开源项目 AboutActivity分析

    1.首先看一下效果 这是手机上显示的效果: 1.1首先是一个标题栏,左侧一个左箭头,然后一个图标. 1.2然后下方是一个可以滑动的页面. 1.3分成了7个部分. 1.4DiyCode的图标. 1.5然 ...

  10. postgreysql

    基础 syntax * \help 生成所有的pg命令 * abort 终止事务/work * alter aggregate 修改聚合函数的定义 ALTER AGGREGATE name ( typ ...