#include #include #include #include using namespace std; using i64 = long long; #ifdef DEBUG #define debug1(x1) cerr << #x1 "=" << (x1) << '\n'; #define debug2(x1, x2) cerr << #x1 "=" << (x1) << ", " << #x2 "=" << (x2) << '\n'; #define debug3(x1, x2, x3) cerr << #x1 "=" << (x1) << ", " << #x2 "=" << (x2) << ", " << #x3 "=" << (x3) << '\n'; #define debug4(x1, x2, x3, x4) cerr << #x1 "=" << (x1) << ", " << #x2 "=" << (x2) << ", " << #x3 "=" << (x3) << ", " << #x4 "=" << (x4) << '\n'; #define debug5(x1, x2, x3, x4, x5) cerr << #x1 "=" << (x1) << ", " << #x2 "=" << (x2) << ", " << #x3 "=" << (x3) << ", " << #x4 "=" << (x4) << ", " << #x5 "=" << (x5) << '\n'; #define GET_MACRO(_1,_2,_3,_4,_5,NAME,...) NAME #define debug(...) GET_MACRO(__VA_ARGS__, debug5, debug4, debug3, debug2, debug1)(__VA_ARGS__) template void debugv(vector v, string sep) { const int n = v.size(); cerr << "'"; for(int i=0; i void debugv(vector v) { debugv(v, " "); } template void debugv(vector> v) { int n = v.size(); for(int i=0; i void debugv(vector>> v) { int n = v.size(); for(int i=0; i void debugv(vector>>> v) { int n = v.size(); for(int i=0; i void debugv(vector>>>> v) { int n = v.size(); for(int i=0; i> G0(n, vector()); // G[n][] vector> rG(n, vector()); // revG[n][] int a, b; i64 c; for(int i=0; i cost0(n, -1); // cost[n] cost0[0] = 0; priority_queue, vector>> que0; // コスト、点番号 que0.emplace(0, 0); while(!que0.empty()) { i64 cc; int v; tie(cc, v) = que0.top(); que0.pop(); cost0[v] = cc; for(edge& e : G0[v]) { if(cost0[e.to] < cc + e.cost) { que0.emplace(cc + e.cost, e.to); } } } vector rcost(n, -1); // rcost[n] rcost[n-1] = 0; priority_queue, vector>> rq; // コスト、点番号 rq.emplace(0, -(n-1)); while(!rq.empty()) { i64 cc; int v; tie(cc, v) = rq.top(); rq.pop(); v *= -1; rcost[v] = cc; for(edge& e : rG[v]) { if(rcost[e.to] < cc + e.cost) { rq.emplace(cc + e.cost, -e.to); } } } i64 days = cost0[n-1]; int cnt = 0; for(int i=0; i