Submission #1204578

#TimeUsernameProblemLanguageResultExecution timeMemory
1204578g4yuhgToll (BOI17_toll)C++20
8 / 100
2225 ms589824 KiB
//Huyduocdithitp #include <bits/stdc++.h> using namespace std; typedef long long ll; #define endl '\n' #define faster ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); const ll INF = (ll)1e18; const int N = 50004; struct Query { ll u, v; } qr[N]; ll k, n, m, q; ll kq[N]; vector<pair<ll,ll>> adj[N]; set<ll> mp1[N], mp2[N]; ll mx = 0; map<ll, ll> state[N]; int main() { faster; cin >> k >> n >> m >> q; mx = n / k; for (int i = 1; i <= m; i++) { ll u, v, w; cin >> u >> v >> w; adj[u].push_back({v, w}); } for (int i = 1; i <= q; i++) { cin >> qr[i].u >> qr[i].v; if (qr[i].u / k >= qr[i].v / k) { kq[i] = -1; } else { kq[i] = INF; mp1[qr[i].u].insert(i); mp2[qr[i].v].insert(i); } } for (int id = 0; id <= mx; id++) { int L = id * k; int R = min<ll>(n, (id + 1) * k); for (int u = L; u <= R; u++) { // process queries ending at u for (auto it : mp2[u]) { auto itState = state[u].find(it); if (itState != state[u].end()) { kq[it] = min(kq[it], itState->second); state[u].erase(itState); } } // add queries starting at u for (auto it : mp1[u]) { state[u][it] = 0; } // relax along outgoing edges for (auto &edge : adj[u]) { ll v = edge.first; ll w = edge.second; for (auto &pr : state[u]) { ll qi = pr.first; ll val = pr.second + w; auto it2 = state[v].find(qi); if (it2 == state[v].end()) state[v][qi] = val; else it2->second = min(it2->second, val); } } } } for (int i = 1; i <= q; i++) { cout << (kq[i] >= INF ? -1 : kq[i]) << endl; } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...