洛谷 P3406 海底高鐵 模擬

2021-09-27 13:57:26 字數 2226 閱讀 3268

大東亞海底隧道連線著廈門、新北、博艾、那霸、鹿兒島等城市,橫穿東海,耗資1000億博艾元,歷時15年,於公元2023年建成。憑藉該隧道,從廈門可以乘坐火車直達台灣、博艾和日本,全程只需要4個小時。

該鐵路經過n個城市,每個城市都有乙個站。不過,由於各個城市之間不能協調好,於是乘車每經過兩個相鄰的城市之間(方向不限),必須單獨購買這一小段的車票。第i段鐵路連線了城市i和城市i+1(1<=i雖然一些事情沒有協調好,各段鐵路公司也為了方便乘客,推出了ic卡。對於第i段鐵路,需要花ci博艾元的工本費購買一張ic卡,然後乘坐這段鐵路一次就只要扣bi(biuim現在需要出差,要去m個城市,從城市p1出發分別按照p1,p2,p3...pm的順序訪問各個城市,可能會多次訪問乙個城市,且相鄰訪問的城市位置不一定相鄰,而且不會是同乙個城市。

現在他希望知道,出差結束後,至少會花掉多少的錢,包括購買紙質車票、買卡和充值的總費用。

第一行兩個整數,n,m。

接下來一行,m個數字,表示pi

接下來n-1行,表示第i段鐵路的ai,bi,ci

乙個整數,表示最少花費

輸入 #1複製

9 10

3 1 4 1 5 9 2 6 5 3

200 100 50

300 299 100

500 200 500

345 234 123

100 50 100

600 100 1

450 400 80

2 1 10

輸出 #1複製

6394
2到3以及8到9買票,其餘買卡。

對於30%資料 m=2

對於另外30%資料 n<=1000 ,m<=1000

對於100%的資料 m,n<=100000,ai,bi,ci<=100000

完了,文化課降智,這道黃題想了好久。。

廢話少說。對於第i個城市,與第i+1個城市相連的是第i段鐵路。所以任意兩個相鄰的站點購買同種車票有且僅有一種費用,通過第i段鐵路的**,僅與在第i個城市和第i+1個城市之間的通過次數有關。若你不是很懂這句話,可以再讀一讀題目。

那我們不就只需要求某段鐵路的通過次數不就ok了?

對於每個區間,用乙個for對其所經次數+1即可。如下**:

#include #include #define ll long long

#define maxn 100001

using namespace std;

ll n,m,s,p[maxn],a[maxn],b[maxn],c[maxn],vis[maxn];

signed main()

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

for(i=1;i<=m-1;i++) }

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

cout《滿心歡喜地交上去,卻只有70分,後3個點tle。

為什麼會t?很簡單,我們的時間全部花費在了記錄vis[i]。如果|p[i]-p[i+1]|的值很大,這個程式的效率會大大降低,退化到近似於o(m^2)!

仔細想一想,我們真的需要這麼記錄嗎?

回憶我們在樹狀陣列模版2的思路,對於每乙個區間改操作,在其左端點的位置+區間的值,再在右端點+1的位置-區間的值。這不就是相當於差分陣列嗎?那麼同理,對於區間[p[i],p[i+1]),是不是就可以仿照上面的思路,讓vis[p[i]]++,讓vis[p[i+1]]--(若p[i]>p[i+1]),最後再跑一遍字首和使得vis陣列的值不變呢?

#include #include #define ll long long

#define maxn 100001

using namespace std;

ll n,m,s,p[maxn],a[maxn],b[maxn],c[maxn],vis[maxn];

signed main()

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

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

else

vis[l]++;

vis[r]--;

} for(i=1;i<=n-1;i++)

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

cout

}

洛谷P3406 海底高鐵

大東亞海底隧道連線著廈門 新北 博艾 那霸 鹿兒島等城市,橫穿東海,耗資1000億博艾元,歷時15年,於公元2058年建成。憑藉該隧道,從廈門可以乘坐火車直達台灣 博艾和日本,全程只需要4個小時。該鐵路經過n個城市,每個城市都有乙個站。不過,由於各個城市之間不能協調好,於是乘車每經過兩個相鄰的城市之...

P3406 海底高鐵

不要小看了這個資料範圍 首先明確一下題意,對於樣例中的訪問順序3 1 4 1 5 9 2 6 5 3,它意味著 數字代表城市 從 3 出發,依次經過2 3間的鐵路,1 2間的鐵路,到達1 再從 1 出發,依次經過1 2,2 3,3 4之間的鐵路,到達4,以此類推.顯然,對於任意一段鐵路,可以根據訪問...

洛谷 P3406 海底高鐵 差分

p3406 海底高鐵 基本思路 對於其中一小段,我們要麼全部買紙票,要麼全部刷卡。所以我們只需要統計每一小段經過的總次數。如果你暴力模擬統計的話,估計 一定會tle。接下來來看一組例子 六個數 0 0 0 0 0 0 如果想讓它從第二個到第五個數全部 1,則為 0 1 1 1 1 0 如果這樣模擬 ...