LOJ 3156: 「NOI2019」回家路线

题目传送门:LOJ #3156。

题意简述:

有一张 \(n\) 个点 \(m\) 条边的有向图,边有两个权值 \(p_i\)\(q_i\)\(p_i<q_i\))表示若 \(p_i\) 时刻在这条边的起点,则 \(q_i\) 时刻能到达这条边的终点。

你需要规划一条路线,使得从起点 \(1\) 号点出发,沿着这条路线到达终点 \(n\) 号点。

假设路线依次经过的边为 \(\{a_1,a_2,\ldots,a_k\}\),则需要保证 \(q_{a_{i-1}}\le p_{a_i}\)
而这条路线的代价是 \(\displaystyle q_{a_k}+\sum_{i=2}^{k}f(p_{a_i}-q_{a_{i-1}})+f(p_{a_1})\),其中 \(f(x)=\mathrm{A}x^2+\mathrm{B}x+\mathrm{C}\)

你需要使得你规划的路径的代价最小,输出这个最小代价。

题解:

转移之间的代价是一个二次函数,这是显然的斜率优化 DP 模型。

考虑 \(\mathrm{f}[i]\) 表示经过第 \(i\) 条边后的 \(\sum f(p_{a_j}-q_{a_{j-1}})\),化简式子:

\[\begin{aligned}\mathrm{f}[i]&=\min_{y_j=x_i,q_j\le p_i}\{\mathrm{f}[j]+\mathrm{A}(p_i-q_j)^2+\mathrm{B}(p_i-q_j)+\mathrm{C}\}\\&=\min_{y_j=x_i,q_j\le p_i}\{\mathrm{f}[j]+\mathrm{A}p_i^2-2\mathrm{A}p_iq_j+\mathrm{A}q_j^2+\mathrm{B}p_i-\mathrm{B}q_j+\mathrm{C}\}\\&=\min_{y_j=x_i,q_j\le p_i}\{\mathrm{f}[j]+\mathrm{A}q_j^2-\mathrm{B}q_j-2\mathrm{A}p_iq_j\}+\mathrm{A}p_i^2+\mathrm{B}p_i+\mathrm{C}\end{aligned}\]

其中斜率的表达式是显然的,\(x\) 坐标是 \(q_i\)\(y\) 坐标是 \(\mathrm{f}[i]+\mathrm{A}q_i^2-\mathrm{B}q_i\),令 \(\mathrm{D}_i=\mathrm{A}p_i^2+\mathrm{B}p_i+\mathrm{C}\)
\(\displaystyle\mathrm{f}[i]=\mathrm{D}_i+\min_{y_j=x_i,q_j\le p_i}\{y_j-2\mathrm{A}p_ix_j\}\)

考察两个合法转移点 \(j\)\(k\)\(x_j<x_k\)),转移点 \(j\) 比转移点 \(k\) 优当且仅当:

\[\begin{aligned}y_j-2\mathrm{A}p_ix_j&<y_k-2\mathrm{A}p_ix_k\\2\mathrm{A}p_i(x_k-x_j)&<y_k-y_j\\\frac{y_k-y_j}{x_k-x_j}&>2\mathrm{A}p_i\end{aligned}\]

因为不等号是大于号,所以维护下凸壳。

注意,为了方便,更新顺序为按照 \(p_i\) 从小到大,这样右侧斜率是递增的,但是并不能更新完立刻加入凸壳,而是应该等到轮到相应的 \(p_i\) 时再加入。

以下是代码,时间复杂度为 \(\mathcal{O}(n+m+\max q)\)

#include <cstdio>
#include <algorithm>
#include <vector>typedef double db;
const int MN = 100005, MM = 200005, MQ = 1005;int N, M, _A, _B, _C, Ans = 0x3f3f3f3f;
int d[MN], eu[MM], ev[MM], ep[MM], eq[MM];
std::vector<int> vp[MQ], vq[MQ];
int X[MM], Y[MM], f[MM];
int _stk[MM], *stk[MN], _l[MN], _r[MN];inline db Slope(int i, int j) {if (X[i] == X[j]) return Y[i] == Y[j] ? 0 : Y[i] < Y[j] ? 1e99 : -1e99;return (db)(Y[j] - Y[i]) / (X[j] - X[i]);
}int main() {freopen("route.in", "r", stdin);freopen("route.out", "w", stdout);scanf("%d%d%d%d%d", &N, &M, &_A, &_B, &_C);ev[0] = 1, vq[0].push_back(0), ++d[1];for (int i = 1; i <= M; ++i) {scanf("%d%d%d%d", &eu[i], &ev[i], &ep[i], &eq[i]);vp[ep[i]].push_back(i);vq[eq[i]].push_back(i);++d[ev[i]];}stk[0] = _stk;for (int i = 1; i <= N; ++i) stk[i] = stk[i - 1] + d[i - 1], _l[i] = 1;for (int t = 0; t <= 1000; ++t) {for (auto i : vq[t]) {int u = ev[i], *st = stk[u], l = _l[u], &r = _r[u];while (l < r && Slope(st[r - 1], st[r]) > Slope(st[r], i)) --r;st[++r] = i;if (u == N && Ans > f[i] + eq[i]) Ans = f[i] + eq[i];}for (auto i : vp[t]) {int u = eu[i], *st = stk[u], &l = _l[u], r = _r[u];while (l < r && Slope(st[l], st[l + 1]) < 2 * _A * t) ++l;if (l <= r) f[i] = Y[st[l]] - 2 * _A * t * X[st[l]] + _A * t * t + _B * t + _C;else f[i] = 0x3f3f3f3f;X[i] = eq[i], Y[i] = f[i] + _A * eq[i] * eq[i] - _B * eq[i];}}printf("%d\n", Ans);return 0;
}

转载于:https://www.cnblogs.com/PinkRabbit/p/NOI2019D1T1.html

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

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

相关文章

线程池概述

线程池 一个线程池的工作线程代表应用程序的高效执行异步回调的集合。线程池主要用于减少应用程序线程的数量并提供工作线程的管理。应用程序可以对工作项进行排队&#xff0c;将工作与可等待的句柄相关联&#xff0c;根据计时器自动排队&#xff0c;并与I / O绑定。 线程池架…

WEB 请求处理二:Nginx 请求 反向代理

上一篇《WEB请求处理一&#xff1a;浏览器请求发起处理》&#xff0c;我们讲述了浏览器端请求发起过程&#xff0c;通过DNS域名解析服务器IP&#xff0c;并建立TCP连接&#xff0c;发送HTTP请求。本文将讲述请求到达反向代理服务器的一个处理过程&#xff0c;比如&#xff1a;在…

方向盘的正确驾驭方法

如果问您油门踏板和方向盘哪个与驾驶员最“亲密”&#xff0c;您会选择谁呢&#xff1f;恐怕还是方向盘吧。如果汽车行驶过程中您的双手同时离开了方向盘&#xff0c;那么事故的隐患也就随之而来。下面我们就为您全面介绍汽车方向盘的正确使用方法。专家介绍&#xff0c;握方向…

SQL server 2005中无法新建作业(Job)的问题

客户端是使用企业管理其&#xff08;Management Studio&#xff09;新建job&#xff0c;总是无法创建&#xff0c;查找了很多资料&#xff0c;有的说是需要sp2, 但有的又说不是... ... 没有时间去研究为什么&#xff0c;但确有一种方法解决&#xff1a;到服务器端去创建job&…

线程池API

线程池API 线程池应用程序编程接口&#xff08;API&#xff09;使用基于对象的设计。以下每个对象都由用户模式数据结构表示&#xff1a; 池对象是一组可用于执行工作的工作线程。每个进程可以根据需要创建具有不同特征的多个隔离池。每个进程都有一个默认池。清理组与一组回…

WEB 请求处理 一:浏览器 请求发起处理

最近&#xff0c;终于要把《WEB请求处理系列》提上日程了&#xff0c;一直答应小伙伴们给分享一套完整的WEB请求处理流程&#xff1a;从浏览器、Nginx、Servlet容器&#xff0c;最终到应用程序WEB请求的一个处理流程&#xff0c;前段时间由于其他工作事情的安排&#xff0c;一直…

离合器半联动探秘

离合器踏板作用是切断发动机和变速箱之间的动力&#xff0c;有利于起步、变速、和停车。那么如何更好的使用它呢&#xff1f; 离合器的五种状态示意图 离合器半联动的使用方法揭密如下&#xff1a; 离合器半联动的使用探密之一 将离合器抬到车开始动时你就别再抬了&#xff0c;…

Biztalk Server 2006安装配置

前段时间收到了来自beta.microsoft.com的BTS20006 Beta2的下载地址&#xff0c;这两天对它进行了一番安装配置。下面把一些经过和步骤和大家分享一下&#xff0c;手中有一些去年的Biztalk Server2004版本的培训资料&#xff0c;里面有11个Lab。需要的朋友请留下mail&#xff0c…

apache 官方 Dubbo 文档

只是分享、记录一下 dubbo 的文档地址&#xff1a;apache 官方 Dubbo 文档 其页面内容如下&#xff1a;&#xff08;我是用 chrome 直接右键翻译的&#xff0c;原文档是英文的&#xff09;

制动踏板是什么?

制动踏板就是脚刹&#xff08;行车制动器&#xff09;的踏板&#xff0c;使运行中的机车、车辆及其他运输工具或机械等停止或减低速度的动作。制动的一般原理是在机器的高速轴上固定一个轮或盘&#xff0c;在机座上安装与之相适应的闸瓦、带或盘&#xff0c;在外力作用下使之产…

CSS Framework 960 Grid System (收)

CSS框架 &#xff1a;960 Grid System 官网&#xff1a;http://960.gs/ 什么是框架&#xff1f;框架是一种你能够使用在你的web项目中概念上的结构。CSS框架一般是CSS文件的集合&#xff0c;包括基本风格的字体排版&#xff0c;表单样式&#xff0c;表格布局等等&#xff0c;比…

使用线程本地存储

线程本地存储&#xff08;TLS&#xff09;使同一进程的多个线程能够使用由TlsAlloc函数分配的索引来存储和检索线程本地的值。在此示例中&#xff0c;在进程启动时分配索引。当每个线程启动时&#xff0c;它会分配一个动态内存块&#xff0c;并使用TlsSetValue函数在TLS槽中存储…

发动机的工作原理,你知道吗?

http://auto.jxedt.com/info/5352.htm 发动机是汽车的动力装置&#xff0c;性能优劣直接影响到汽车性能&#xff0c;发动机的类型很多&#xff0c;结构各异&#xff0c;以适应不同车型的需要。按发动机使用燃料划分&#xff0c;可分成汽油发动机和柴油发动机等类别。按发动机汽…

官方文档: Dubbo 框架设计、模块说明、依赖关系

以下内容全文转自 apache 官方 dubbo文档&#xff1a;http://dubbo.apache.org/en-us/docs/dev/design.html 框架设计 图片描述&#xff1a; 浅蓝色背景的左侧区域显示服务用户界面&#xff0c;浅绿色背景的右侧区域显示服务提供者界面&#xff0c;中心区域显示两个侧面界面。…

那些花儿

今天上海下雨了&#xff0c;心绪也变得低落&#xff0c;突然很想念宿舍的姐妹。毕业后就自作聪明地和她们失去了联系&#xff0c;今天去QQ群遛了一圈。虹结婚了&#xff0c;敏还是活得那么潇洒&#xff0c;笑也在努力地生活... 人生啊&#xff01;总是在向前走&#xff0c;遇…

CreateRemoteThread函数

CreateRemoteThread函数 创建在另一个进程的虚拟地址空间中运行的线程。 使用CreateRemoteThreadEx函数创建在另一个进程的虚拟地址空间中运行的线程&#xff0c;并可选择指定扩展属性。 语法 HANDLE CreateRemoteThread(HANDLE hProcess,LPSECURITY_ATTRI…

防火墙问题 Linux系统 /etc/sysconfig/路径下无iptables文件

虚拟机新装了一个CentOs7&#xff0c;然后做防火墙配置的时候找不到iptables文件&#xff0c;解决方法如下&#xff1a; 因为默认使用的是firewall作为防火墙&#xff0c;把他停掉装个iptable systemctl stop firewalld systemctl mask firewalld yum install -y iptables yum …

如果风 知道 ... 如果云 知道 ...

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 //《心灵之音》----- Bandari 来自酷狗。 一直很喜欢听歌&#xff1a; 喜欢默默的听、一个人安安静静的听、长长久久的听、听得忘乎所…

切记!这样洗头最伤身

各种的忙碌已经成为了现代人生活中的一个标志&#xff0c;每天的加班&#xff0c;玩乐到深夜&#xff0c;游戏等&#xff0c;都让不少的人的洗澡时间都只能在临睡前&#xff0c;而女人洗头也只能在晚上临睡之前洗。如果可以有足够的时间&#xff0c;等待头发完全干透了之后&…

可以供MFC调用的,QT实现的DLL(qtwinmigrate实现)

MFC和QT的消息循环机制不同&#xff0c;所以&#xff0c;要让QT写的DLL可以供MFC调用&#xff0c;要做一点特殊的处理 #include <qmfcapp.h> #include <qwinwidget.h> #include <QtGui>#include <QtGui/QMessageBox> #include <windows.h> #incl…