題目←
模擬+貪心
一開始看到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 觀光公交
題目 如果沒有氮氣加速器,則該題為乙個模擬題。但是本題存在氮氣加速器,所以我們需要考慮貪心策略。題目要求我們使所有人等待的時間最短,因此我們需要算出每段路徑 路徑即為車站之間的 d 對時間的貢獻多少,取其中最多的減去就好了。首先我們需要求出每個車站最遠向右影響到什麼地方,然後算出這段地方的影響總人數...
洛谷P1315 觀光公交
風景迷人的小城y 市,擁有n 個美麗的景點。由於慕名而來的遊客越來越多,y 市特意安排了一輛觀光公交車,為遊客提供更便捷的交通服務。觀光公交車在第 0 分鐘出現在 1號景點,隨後依次前往 2 3 4 n 號景點。從第 i 號景點開到第 i 1 號景點需要 di 分鐘。任意時刻,公交車只能往前開,或在...
洛谷P1315 觀光公交
sb貪心.暴露了我 能力巨弱的本質。題面解 首先我們應該想到dp 但是我想到了貪心.然後分析題目本質,每個點有個限制,最早開走時間不得早於最晚上車時間。然後我們就可以把每個人看做都在那個時間上車。然後我們發現,對乙個地方使用加速,會影響它後面一段區間。然後就有個暴力 雛形是列舉在某個點用加速,看它能...