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.pswp.cn/news/448205.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448205.shtml
英文地址,請注明出處:http://en.pswp.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…