Submission #1160218

#TimeUsernameProblemLanguageResultExecution timeMemory
1160218Zero_OPWild Boar (JOI18_wild_boar)C++20
12 / 100
864 ms21064 KiB
#include <bits/stdc++.h> using namespace std; #define FOR(i, l, r) for(int i = (l); i < (r); ++i) #define ROF(i, r, l) for(int i = (r) - 1; i >= (l); --i) #define mp make_pair #define mt make_tuple #define ff first #define ss second #define all(v) begin(v), end(v) #define rall(v) rbegin(v), rend(v) #define sz(v) (int)v.size() #define compact(v) v.erase(unique(all(v)), end(v)) #define pb push_back #define eb emplace_back #define readFile(task) freopen(task, "r", stdin) #define writeFile(task) freopen(task, "w", stdout) #define dbg(x) "[" #x " = " << (x) << "]" template<typename T> bool minimize(T& a, const T& b){ if(a > b) return a = b, true; return false; } template<typename T> bool maximize(T& a, const T& b){ if(a < b) return a = b, true; return false; } using ll = long long; using db = double; using str = string; using ull = unsigned long long; using ldb = long double; using pi = pair<int, int>; using pl = pair<ll, ll>; using pd = pair<db, db>; using vi = vector<int>; using vl = vector<ll>; using vb = vector<bool>; using vc = vector<char>; using vs = vector<str>; using vpi = vector<pi>; using vpl = vector<pl>; using vpd = vector<pd>; using vvi = vector<vi>; using vvl = vector<vl>; void setIO(){ ios_base::sync_with_stdio(0); cin.tie(0); #ifdef LOCAL readFile("task.inp"); writeFile("task.out"); #endif // LOCAL } template<typename T, typename U> ostream& operator << (ostream& out, const pair<T, U>& p){ return out << "(" << p.ff << ", " << p.ss << ")"; } const int MAX = 2e3 + 5; const int BOUND = 1e5 + 5; const ll inf = 1e15; struct edge{ int u, v, w; edge() : u(), v(), w(){} edge(int u, int v, int w) : u(u), v(v), w(w) {} int get(int x){ return x ^ u ^ v; } } e[MAX]; int N, M, L, T, nn, deg[MAX], X[BOUND]; pi inv[MAX * 2]; vi adj[MAX]; int idx[MAX][MAX]; vl F[MAX * 2], G[MAX * 2]; using nd = pair<ll, int>; vl dijkstra_with_obstacles(int p){ vl d(nn, inf); d[p] = 0; // cout << dbg(inv[p]) << '\n'; priority_queue<nd, vector<nd>, greater<nd>> pq; pq.push(mp(0, p)); while(!pq.empty()){ ll dist; int pos; tie(dist, pos) = pq.top(); pq.pop(); if(d[pos] != dist) continue; int u, bid; tie(u, bid) = inv[pos]; // cout << dbg(inv[pos]) << dbg(dist) << '\n'; for(auto id : adj[u]) if(bid != id){ int v = e[id].get(u); int to = idx[v][id]; // cout << dbg(v) << dbg(id) << dbg(to) << '\n'; if(minimize(d[to], d[pos] + e[id].w)){ pq.push(mp(d[to], to)); } } } // cout << '\n'; return d; } vl dijkstra_without_obstacles(int s){ vl d(nn, inf); priority_queue<nd, vector<nd>, greater<nd>> pq; for(auto id : adj[s]){ int v = e[id].get(s); d[idx[v][id]] = e[id].w; pq.push(mp(e[id].w, idx[v][id])); } // cout << dbg(s) << '\n'; while(!pq.empty()){ ll dist; int pos; tie(dist, pos) = pq.top(); pq.pop(); if(d[pos] != dist) continue; // cout << dbg(inv[pos]) << ' ' << dist << '\n'; int u, bid; tie(u, bid) = inv[pos]; for(auto id : adj[u]) if(bid != id){ int v = e[id].get(u); int to = idx[v][id]; if(minimize(d[to], d[pos] + e[id].w)){ pq.push(mp(d[to], to)); } } } // cout << '\n'; return d; } ll solve(){ vl dp(nn, inf); for(auto id : adj[X[1]]){ int des = idx[X[1]][id]; dp[des] = G[X[0]][des]; // cout << inv[des] << " : " << dp[des] << '\n'; } FOR(i, 1, L-1){ vl nw(nn, inf); for(auto id_des : adj[X[i+1]]){ int des = idx[X[i+1]][id_des]; for(auto id_st : adj[X[i]]){ int st = idx[X[i]][id_st]; minimize(nw[des], dp[st] + F[st][des]); } } swap(dp, nw); } ll result = *min_element(all(dp)); if(result == inf) result = -1; return result; } void testcase(){ cin >> N >> M >> T >> L; memset(idx, -1, sizeof(idx)); FOR(i, 0, M){ int u, v, w; cin >> u >> v >> w; --u, --v; e[i] = edge(u, v, w); adj[u].eb(i); adj[v].eb(i); inv[idx[u][i] = nn++] = mp(u, i); inv[idx[v][i] = nn++] = mp(v, i); } // FOR(i, 0, nn) cout << dbg(inv[i]) << '\n'; cout << '\n'; // FOR(i, 0, N) for(auto j : adj[i]) cout << i << ' ' << j << '\n'; FOR(i, 0, nn) F[i] = dijkstra_with_obstacles(i); FOR(i, 0, N) G[i] = dijkstra_without_obstacles(i); FOR(i, 0, L) cin >> X[i], --X[i]; while(T--){ int P, Q; cin >> P >> Q; --P, --Q; X[P] = Q; cout << solve() << '\n'; } } int main(){ setIO(); int T = 1; // cin >> T; while(T--) testcase(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...