【斜率优化】仓库建设(luogu 2120)

仓库建设

luogu 2120

题目大意

有一个斜坡,上面有n个工厂(山顶是1,山脚是nnn,工厂都是漏填),上面有pip_ipi个货物,和工厂1的距离为x1x_1x1
现在有一场大雨,你可以在某些工厂处建立仓库(费用是cic_ici),没有建立仓库的工厂要把货物运到更低的仓库(及编号越大的仓库),运费是货物数∗*距离
现在问你全部货物运到仓库中最少需要多少钱

输入样例

3
0 5 10
5 3 100
9 6 10

输出样例

32

样例说明

在工厂 1 和工厂 3 建立仓库,建立费用为 10+10=2010+10=2010+10=20 ,运输费用为 (9−5)×3=12(9-5) \times 3 = 12(95)×3=12,总费用 32。

数据范围

对于 20%20\%20% 的数据,保证 n≤500n \leq 500n500
对于 40%40\%40% 的数据,保证 n≤104n \leq 10^4n104
对于 100%100\%100% 的数据,保证 1≤n≤1061 \leq n \leq 10^61n1060≤xi,pi,ci<2310 \leq x_i,~p_i,~c_i < 2^{31}0xi, pi, ci<231
对于任意的 1≤i<n1 \leq i < n1i<n,保证 xi<xi+1。x_i < x_{i + 1} 。xi<xi+1
设答案为 ansansans,保证 ans+∑i=1npixi<263ans + \sum_{i = 1}^{n} p_ix_i < 2^{63}ans+i=1npixi<263

解题思路

我们设fif_ifi为在iii处建仓库,前iii个工厂的货物全部运到仓库的最小费用(这里把ppp改为sss,把xxx改为vvv
我们就可以得出转移方程
fi=min⁡{fj+ci+∑k=j+1i−1(vi−vk)sk}=min⁡{fj+ci+∑k=j+1i(vi−vk)sk}=min⁡{fj+ci+∑k=j+1ivisk−∑k=j+1ivksk}=min⁡{fj+ci+(sumsi−sumsj)vi−(vsi−vsj)}\begin{aligned}f_i & = \min\{f_j+c_i+\sum_{k=j+1}^{i-1}(v_i-v_k)s_k\} \\ & = \min\{f_j+c_i+\sum_{k=j+1}^{i}(v_i-v_k)s_k\} \\ & =\min\{f_j+c_i+\sum_{k=j+1}^{i}v_is_k-\sum_{k=j+1}^{i}v_ks_k\} \\ & = \min\{f_j + c_i + (sums_i-sums_j)v_i - (vs_i - vs_j)\} \end{aligned}fi=min{fj+ci+k=j+1i1(vivk)sk}=min{fj+ci+k=j+1i(vivk)sk}=min{fj+ci+k=j+1iviskk=j+1ivksk}=min{fj+ci+(sumsisumsj)vi(vsivsj)}
注:
第二行加了iii这一项,但因为vi−vi=0v_i-v_i=0vivi=0所以结果不变
第四行vsi=∑j=1ivisivs_i=\sum_{j=1}^{i} v_is_ivsi=j=1ivisi
若现在有两个决策点a,ba,ba,b满足a>b,aa>b,aa>b,a优于bbb
则:
fa+ci+(sumsi−sumsa)vi−(vsi−vsa)<fb+ci+(sumsi−sumsb)vi−(vsi−vsb)f_a + c_i + (sums_i-sums_a)v_i - (vs_i - vs_a) < f_b + c_i + (sums_i-sums_b)v_i - (vs_i - vs_b)fa+ci+(sumsisumsa)vi(vsivsa)<fb+ci+(sumsisumsb)vi(vsivsb)
fa+ci+sumsivi−sumsavi−vsi+vsa<fb+ci+sumsivi−sumsbvi−vsi+vsbf_a + c_i + sums_iv_i-sums_av_i - vs_i + vs_a < f_b + c_i + sums_iv_i-sums_bv_i - vs_i + vs_bfa+ci+sumsivisumsavivsi+vsa<fb+ci+sumsivisumsbvivsi+vsb
fa−sumsavi+vsa<fb−sumsbvi+vsbf_a-sums_av_i + vs_a < f_b-sums_bv_i + vs_bfasumsavi+vsa<fbsumsbvi+vsb
(fa+vsa)−(fb+vsb)<sumsavi−sumsbvi(f_a+vs_a)-(f_b+vs_b)< sums_av_i-sums_bv_i(fa+vsa)(fb+vsb)<sumsavisumsbvi
(fa+vsa)−(fb+vsb)<sumsavi−sumsbvi(f_a+vs_a)-(f_b+vs_b)< sums_av_i-sums_bv_i(fa+vsa)(fb+vsb)<sumsavisumsbvi
((fa+vsa)−(fb+vsb))/(sumsa−sumsb)<vi((f_a+vs_a)-(f_b+vs_b))/(sums_a-sums_b)<v_i((fa+vsa)(fb+vsb))/(sumsasumsb)<vi
我们设
yi=fi+vsay_i=f_i+vs_ayi=fi+vsa
xi=sumsix_i=sums_ixi=sumsi

(ya−yb)/(xa−xb)<vi(y_a-y_b)/(x_a-x_b)<v_i(yayb)/(xaxb)<vi
然后按照斜率优化模板套即可

代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll n, l, r, v[1000050], s[1000050], c[1000050], d[1000050], y[1000050], f[1000050], vs[1000050];
int main()
{scanf("%d", &n);for (int i = 1; i <= n; ++i){scanf("%d%d%d", &v[i], &s[i], &c[i]);vs[i] = vs[i - 1] + v[i] * s[i];s[i] += s[i - 1];//s没用,就直接弄成前缀和}for (int i = 1; i <= n; ++i){while(r > l && (y[d[l + 1]] - y[d[l]]) < v[i] * (s[d[l + 1]] - s[d[l]])) l++;//模板f[i] = f[d[l]] + c[i] + (s[i] - s[d[l]]) * v[i] - (vs[i] - vs[d[l]]);y[i] = f[i] + vs[i];while(r > l && (y[i] - y[d[r]])*(s[d[r]] - s[d[r-1]]) < (y[d[r]] - y[d[r-1]])*(s[i] - s[d[r]])) r--;d[++r] = i;}printf("%d", f[n]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320204.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客网【每日一题】4月30日题目精讲 换个角度思考

链接&#xff1a; 文章目录题目描述题解&#xff1a;主席树做法&#xff1a;代码&#xff1a;树状数组&#xff1a;更扯淡的方法&#xff01;&#xff01;&#xff01;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言…

三元环计数四元环计数

三元环计数 问题 给出一张n个点m条边的无向图&#xff0c;问图中有多少个三元组{ u , v , w } &#xff0c;满足图中存在 { (u,v) , (v,w) , (w,u) } 三条边。 求解 Step1 定向 将所有点按 度数 从小到大排序&#xff0c;如果度数相同按 点编号 从小到大排序&#xff0c;u…

YbtOJ#20240-[冲刺NOIP2020模拟赛Day10]弱者对决【笛卡尔树,区间dp】

正题 题目链接:https://www.ybtoj.com.cn/contest/68/problem/4 题目大意 mmm个三元组(ai,bi,ci)(a_i,b_i,c_i)(ai​,bi​,ci​)&#xff0c;如果ci≥min{xj}(ai≤j≤bi)c_i\geq min\{x_j\}(a_i\leq j\leq b_i)ci​≥min{xj​}(ai​≤j≤bi​)那么可以获得min{xj}min\{x_j\}mi…

牛客网【每日一题】5月1日题目 [SCOI2012]滑雪与时间胶囊

链接&#xff1a; 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 a180285非常喜欢滑雪。他来到一座雪山&#xff0c;这里分布着M条供滑行的轨道和N个轨道之间的交点&#x…

漫谈单体架构与微服务架构(上):单体架构

最近微服务架构特别火爆&#xff0c;就跟人工智能、区块链一样&#xff0c;软件架构设计如果不提微服务&#xff0c;感觉就像是与世界先进的架构风格和开发技术脱了节似的&#xff0c;各方各面都无法彰显高大上的气质。本来再打算使用一套系列文章来讨论微服务的方方面面&#…

【数学】奶牛编号(jzoj 2932)

奶牛编号 jozj 2932 题目大意 求出有m个1的01串中字典序第n大的字典序 输入样例 7 3输出样例 10110数据范围 1⩽M⩽101 \leqslant M \leqslant 101⩽M⩽10 1⩽N⩽1071 \leqslant N \leqslant 10^71⩽N⩽107 解题思路 我们先从01串长度入手&#xff1a; 先对m1m 1m1的特…

CF732F Tourist Reform(dfs树、边双连通图、tarjan)

因为知道了算法tag&#xff0c;所以想到了正解&#xff1a; 先给出两个性质&#xff1a; 边双给边定向一定可以转为强连通图,此为最优解树给边定向后R的最小值必为0 性质2证明如下&#xff1a; 设树有n个节点, 若R_min!0, 则每点出度至少为1,各点出度之和至少为n, 则至少有…

【归并排序】奶牛的图片(jzoj 1812)

奶牛的图片 jzoj 1812 题目大意 给你一个序列&#xff0c;你可以交换相邻的两个数 让你用最少的交换次数来使得这个序列变成形如a1,a2...n,1,2...a−1,aa1,a2...n,1,2...a-1,aa1,a2...n,1,2...a−1,a的序列 问你最少的交换次数是多少次 输入样例 5 3 5 4 2 1输出样例 2解…

YbtOJ#20237-[冲刺NOIP2020模拟赛Day10]区间均值【树状数组】

正题 题目链接:https://www.ybtoj.com.cn/contest/68/problem/1 题目大意 nnn个数字的序列&#xff0c;求有多少个区间[l,r][l,r][l,r]的平均值在[L,R][L,R][L,R]的范围内。 解题思路 如果让每个ai−xa_i-xai​−x&#xff0c;那么统计区间和大于等于111的区间数量就可以统计…

ASP.NET Core应用程序的参数配置及使用

应用程序的开发不仅仅是写代码这点事情。假设你正在开发一个能够支持多次部署的微服务&#xff0c;此时你就需要有一个合理的应用程序配置方案&#xff0c;以便在开发和生产环境中能够方便地选用不同的配置参数&#xff0c;并且能够在部署到容器服务&#xff08;比如ACS或者Kub…

“Shopee杯” e起来编程暨武汉大学2020年大学生程序设计大赛决赛(重现赛)

比赛链接 文章目录A题 A Simple Problem about election题目描述题解&#xff1a;代码&#xff1a;D题 Deploy the medical team题意&#xff1a;题解&#xff1a;代码&#xff1a;F题 Figure out the sequence题意&#xff1a;题解&#xff1a;代码A题 A Simple Problem about…

Kruskal重构树

建树 模仿kruskal的过程&#xff0c;先将边权排序 依次遍历每条边 若该边连接的两个节点u和v不在一个并查集内 就新建一个结点node 该点点权为这条边的边权 找到u&#xff0c;v所在并查集的根 fufufu,fvfvfv 连边(node,fu)(n o d e , fu )(node,fu) (node,fv)( n o d e , f…

【斜率优化】玩具装箱(luogu 3195)

玩具装箱 luogu 3195 题目大意 有n件物品&#xff0c;每件物品有相对的长度CiC_iCi​现在要把这n件物品放到容器中&#xff0c;切放的物品必须是连续的&#xff0c;若把第i件物品到第j件物品放到一个容器中&#xff0c;那此容器的长度定义为xj−i∑kijCixj−i\sum_{ki}^{j} …

P5895-[IOI2013]dreaming梦想【树的直径,结论】

正题 题目链接:https://www.luogu.com.cn/problem/P5895 题目大意 nnn个点的一个森林&#xff0c;加入若干条长度为LLL的边使它变成一个树&#xff0c;求这棵树的最小直径。 解题思路 显然最优情况一定是以某个节点作为中间展开的一个菊花图&#xff08;每棵树看做一个点&…

RabbitMQ一个简单可靠的方案(.Net Core实现)

前言最近需要使用到消息队列相关技术&#xff0c;于是重新接触RabbitMQ。其中遇到了不少可靠性方面的问题&#xff0c;归纳了一下&#xff0c;大概有以下几种&#xff1a;1. 临时异常&#xff0c;如数据库网络闪断、http请求临时失效等&#xff1b;2. 时序异常&#xff0c;如A任…

CF1120D Power Tree(树形DP/构造+差分+最小生成树)

解法一&#xff1a;树形DP 个人觉得这个方法是比较可能想到的&#xff0c;但是输出方案很恶心 先转换题意&#xff1a;“无论怎样规定叶子的初始点权&#xff0c;都可以通过操作你选择的点来让所有叶子的点权清空”意味着每个叶子节点都可以通过一系列操作单独1、-1 模拟一下…

牛牛染颜色

链接&#xff1a; 文章目录题目描述题意&#xff1a;题解&#xff1a;核心代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld题目描述 牛牛最近得到了一颗树&#xff0…

【数学期望】【LCA】【树形DP】树

树 题目大意 给你一棵有n个节点的树&#xff0c;以及m个询问&#xff0c;每个询问需要你回答一个点到另一个点要经过的期望边数 输入样例 4 2 1 2 2 3 3 4 1 4 3 4输出样例 9 5 数据范围 对于 20%20\%20%的数据,N⩽10.N \leqslant 10.N⩽10. 对于 40%40\%40%的数据,N⩽10…

P3768-简单的数学题【莫比乌斯反演,杜教筛】

正题 题目链接:https://www.luogu.com.cn/problem/P3768 题目大意 给出n,pn,pn,p求∑i1n∑j1ngcd(i,j)∗i∗j\sum_{i1}^n\sum_{j1}^ngcd(i,j)*i*ji1∑n​j1∑n​gcd(i,j)∗i∗j模ppp的值。 解题思路 下文中定义Hy(x)∑i1xiyH_y(x)\sum_{i1}^xi^yHy​(x)∑i1x​iy 首先显然是…

.netcore consul实现服务注册与发现-单节点部署

一、Consul的基础介绍Consul是HashiCorp公司推出的开源工具&#xff0c;用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案&#xff0c;比如 Airbnb的SmartStack等相比&#xff0c;Consul的方案更“一站式”&#xff0c;内置了服务注册与发现框 架、分布一…