洛谷P1315 觀光公交 模擬 貪心

2022-06-05 04:36:09 字數 1351 閱讀 7653

題目←

模擬+貪心

一開始看到10^5的資料,以為要klogn就敲了個線段樹上去

結果沒考慮後效性,只過了3個點

正解:一開始先處理出每一站的到站時間是對的,而隨著修改到站時間的改變不一定滿足字首關係

假設在某一站有人很晚才出發,那不管先前改變了多少後面的到站時間都是不變的

綜上還需要維護修改一段距離時最遠能影響到的點(遞推標籤的由來)

設修改i後的線段最遠影響到的點為g[i]

設某一站最終出發的人時間為last[i],也就是汽車在這個站最早的出發時間

如果由前推來的to[i] >= last[i] +1,則說明i能影響到後面;

則g[i - 1]就可以由last[i]推來

否則即便修改i - 1後的線段最多也只能影響到在站點i下車的人們,g[i - 1] = i

注意修改後,隨著d[i]的改變,to[i]也會改變

還有一點一開始沒明白:

乙個人的旅行時間是否受影響,僅於它的到達點有關係。

就是說當乙個人的到達點被包含在i---g[i]時,不管出發點是否被包含其中,旅行時間是一定會被影響的

1、出發點在i及i前時,被影響的是坐上車後的時間

2、出發點在i後時,被影響的是等待時間

然後o(n*k)的模擬

#include#include#include#define ll long long

const ll m = 100000 + 60;

using namespace std;

ll n,m,k;

ll t[m],a[m],b[m],to[m];

ll d[m],last[m],ans,sum[m],o[m],g[m];

int main()

ll now = 0;

for(ll i = 1;i <= n;i ++)

g[n] = g[n - 1] = n;

for(int i = n - 2;i >= 1;i --)

else g[i] = i + 1;

} for(ll t = 1;t <= k;t ++)

}if(flag == -1)break;

d[flag] --;

now = 0;

for(ll i = 1;i <= n;i ++)

g[n] = g[n - 1] = n;

for(int i = n - 2;i >= 1;i --)

else g[i] = i + 1;

} }

for(int i = 1;i <= m;i ++)

cout << ans;

return 0;

}

洛谷P1315 觀光公交

題目 模擬 貪心 一開始看到10 5的資料,以為要klogn就敲了個線段樹上去 結果沒考慮後效性,只過了3個點 正解 一開始先處理出每一站的到站時間是對的,而隨著修改到站時間的改變不一定滿足字首關係 假設在某一站有人很晚才出發,那不管先前改變了多少後面的到站時間都是不變的 綜上 還需要維護修改一段距...

洛谷P1315 觀光公交

題目 如果沒有氮氣加速器,則該題為乙個模擬題。但是本題存在氮氣加速器,所以我們需要考慮貪心策略。題目要求我們使所有人等待的時間最短,因此我們需要算出每段路徑 路徑即為車站之間的 d 對時間的貢獻多少,取其中最多的減去就好了。首先我們需要求出每個車站最遠向右影響到什麼地方,然後算出這段地方的影響總人數...

洛谷P1315 觀光公交

風景迷人的小城y 市,擁有n 個美麗的景點。由於慕名而來的遊客越來越多,y 市特意安排了一輛觀光公交車,為遊客提供更便捷的交通服務。觀光公交車在第 0 分鐘出現在 1號景點,隨後依次前往 2 3 4 n 號景點。從第 i 號景點開到第 i 1 號景點需要 di 分鐘。任意時刻,公交車只能往前開,或在...