好久沒出去旅遊啦!
森森決定去 \(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 號城市中間...