3468 森森旅遊

2022-10-07 22:42:22 字數 3750 閱讀 6680

好久沒出去旅遊啦!

森森決定去 \(z\) 省旅遊一下。

\(z\) 省有 \(n\) 座城市 (從 1 到 \(n\) 編號) 以及 \(m\) 條連線兩座城市的有向旅行線路(例如自駕、長途汽車、火車、飛 機、輪船等),每次經過一條旅行線路時都需要支付該線路的費用(但這個收費標準可能不止一種,例如車票跟機 票一般不是乙個**)。

\(z\) 省為了鼓勵大家在省內多逛迋,推出了旅遊金計畫: 在 \(i\) 號城市可以用 1 元現金兌換 \(a_\) 元旅遊金(只要現金足 夠,可以無限次兌換)。

城市間的交通即可以使用現金支付路費,也可以用旅遊金支付。

具體來說,當通過第 \(j\) 條旅行線路時,可以用 \(c_\) 元現金或 \(d_\) 元旅遊金支付路費。

注意:每次只能選擇一種支付方式,不可同時使用現金和旅遊金混合支付。

但對於不同的線路,旅客可以自由選擇不同的支付方式。

森森決定從 \(1\) 號城市出發,到 \(n\) 號城市去。

他打算在出發前準備一些現金,並在途中的某個城市將剩餘現金 全部 換成旅遊金後繼續斿遊,直到到達 \(n\) 號城市 為止。

當然,他也可以選擇在 1 號城市就兌換旅遊金,或全部使用現金完成旅程。

\(z\) 省**會根據每個城市參與活動的情況調整匯率(即調整在某個城市 1 元現金能換多少旅遊金)。

現在你需要幫助森森計算一下,在每次調整之後最少需要攜帶多少現金才能完成他的旅程。

輸入在第一行給出三個整數 \(n, m\) 與 \(q\) ,依次表示城市的數量、旅行線路的數量以及匯率調整的次數。

接下來 \(m\) 行,每行給出四個整數 \(u, v, c\) 與 \(d\) ,表示一條從 \(u\) 號城市通向 \(v\) 號城市的有向旅行線路。每次通過 該線路需要支付 \(c\) 元現金或 \(d\) 元旅斿金。數字間以空格分隔。輸入保證從 \(1\) 號城市出發,一定可以通過若干條線 路到達 \(n\) 號城市,但兩城市間的旅行線路可能不止一條,對應不同的收費標準;也允許在城市內部遊玩(即 \(u\) 和\(v\) 相同)。

接下來的一行輸入 \(n\) 個整數 \(a_, a_, \cdots, a_\) ,其中 \(a_\) 表示一開始在 \(i\) 號城市能用 1 元現金兌換 \(a_\) 個旅遊金。數 字間以空格分隔。

接下來 \(q\) 行描述匯率的調整。第 \(i\) 行輸入兩個整數 \(x_\) 與 \(a_^\) ,表示第 \(i\) 次匯率調整後, \(x_\) 號城市能用 1 元現金兌 換 \(a_^\) 個旅遊金,而其它城市旅遊金匯率不變。請注意:每次匯率調整都是在上一次匯率調整的基礎上進行的。

輸出格式

資料範圍

\(\begin

&1 \leq n \leq 10^ \\

&1 \leq m \leq 2 \times 10^ \\

&1 \leq q \leq 10^ \\

&1 \leq u, v \leq n \\

&1 \leq c, d \leq 10^ \\

&1 \leq a_ \leq 10^ \\

&1 \leq x_ \leq n \\

&1 \leq a_^ \leq 10^

\end

\)輸入樣例:

6 11 3

1 2 3 5

1 3 8 4

2 4 4 6

3 1 8 6

1 3 10 8

2 3 2 8

3 4 5 3

3 5 10 7

3 3 2 3

4 6 10 12

5 6 10 6

3 4 5 2 5 100

1 22 1

1 17

輸出樣例:
8

81

樣例解釋

對於第一次匯率調整,森森可以沿著 \(1→2→4→6\) 的線路旅行,並在 \(2\) 號城市兌換旅遊金;

對於第二次匯率調整,森森可以沿著 \(1→2→3→4→6\) 的線路旅行,並在 \(3\) 號城市兌換旅遊金;

對於第三次匯率調整,森森可以沿著 \(1→3→5→6\) 的線路旅行,並在 \(1\) 號城市兌換旅遊金。

dijkstra

假設在某個點 \(x\) 處兌換旅遊金,則在 \(x\) 前用的都是現金,\(x\) 後用的都是旅遊金,兩者獨立,即 \(x\) 前的最小值與 \(x\) 後的最小值互不影響,可以轉換為單源最短路問題,設 \(d1[i]\) 為 \(1\) 到 \(i\) 的最短路,\(d2[i]\) 為 \(n\) 到 \(i\) 的最短路,其中求 \(d2[i]\) 可反向建邊,最後在 \(x\) 處兌換旅遊金所需的最少現金為 \(d1[x]+\left \lceil \frac \right \rceil\),最後更新答案可用set,注意到達不了的點不能放進set裡

// problem: 森森旅遊

// contest: acwing

// url:

// memory limit: 128 mb

// time limit: 1000 ms

// // powered by cp editor (

// %%%skyqwq

#include // #define int long long

#define help

#define pb push_back

#define fi first

#define se second

#define mkp make_pair

using namespace std;

typedef long long ll;

typedef pairpii;

typedef pairpll;

template bool chkmax(t &x, t y)

template bool chkmin(t &x, t y)

template void inline read(t &x)

while (s <= '9' && s >= '0') x = x * 10 + (s ^ 48), s = getchar();

x *= f;

}const int n=1e5+5;

const ll inf=0x3f3f3f3f3f3f3f3f;

int n,m,q,a[n];

ll d1[n],d2[n];

bool v[n];

vectoradj1[n],adj2[n];

sets;

void dijkstra(int s,ll d[n],vectoradj[n])

); while(q.size())

); }

} }}int main()

); adj2[b].pb();

}for(int i=1;i<=n;i++)scanf("%d",&a[i]);

dijkstra(1,d1,adj1);

dijkstra(n,d2,adj2);

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

if(d1[i]!=inf&&d2[i]!=inf)s.insert();

while(q--)

auto p=s.lower_bound();

s.erase(p);

a[x]=w;

s.insert();

printf("%lld\n",s.begin()->fi);

}return 0;

}

PTA 森森快遞 (30 分)

7 14 森森快遞 30 分 森森開了一家快遞公司,叫森森快遞。因為公司剛剛開張,所以業務路線很簡單,可以認為是一條直線上的n個城市,這些城市從左到右依次從0到 n 1 編號。由於道路限制,第i號城市 i 0,n 2 與第 i 1 號城市中間往返的運輸貨物重量在同一時刻不能超過c i 公斤。公司開張...

7 16 森森快遞 30 分

森森開了一家快遞公司,叫森森快遞。因為公司剛剛開張,所以業務路線很簡單,可以認為是一條直線上的n個城市,這些城市從左到右依次從0到 n 1 編號。由於道路限制,第i號城市 i 0,n 2 與第 i 1 號城市中間往返的運輸貨物重量在同一時刻不能超過c i 公斤。公司開張後很快接到了q張訂單,其中j張...

7 3 森森快遞 35分

7 3 森森快遞 35分 有兩個地方超時,要用線段樹維護資料。7 3 森森快遞 35分 森森開了一家快遞公司,叫森森快遞。因為公司剛剛開張,所以業務路線很簡單,可以認為是一條直線上的n個城市,這些城市從左到右依次從0到 n 1 編號。由於道路限制,第i號城市 i 0,n 2 與第 i 1 號城市中間...