제출 #1323659

#제출 시각아이디문제언어결과실행 시간메모리
1323659husseinjuandaToll (BOI17_toll)C++20
100 / 100
86 ms16092 KiB
#include <bits/stdc++.h> using namespace std; #define int long long int k, n, e, o; vector<vector<pair<int, int>>> g; vector<vector<pair<int, int>>> rg; vector<vector<pair<int, int>>> m; vector<int> ns; vector<vector<int>> dpl; vector<vector<int>> dpr; void dnc(int l, int r){ if(l > r) return; for(int y = 0; y < k; y++){ for(int z = l*k; z < min((r+1)*k, n); z++){ dpl[y][z] = 2e9; dpr[y][z] = 2e9; } } int mid = (l+r)/2; int h = 0; for(int y = mid*k; y < min((mid+1)*k, n); y++){ dpl[h][y] = 0; dpr[h][y] = 0; h++; } h = 0; for(int y = mid*k; y < min((mid+1)*k, n); y++){ for(int j = y; j < min(k*(r+1), n); j++){ if(dpr[h][j] == 2e9) continue; for(auto [a, b] : g[j]){ dpr[h][a] = min(dpr[h][a], dpr[h][j]+b); } } for(int j = y; j >= l*k; j--){ if(dpl[h][j] == 2e9) continue; for(auto [a, b] : rg[j]){ dpl[h][a] = min(dpl[h][a], dpl[h][j]+b); } } h++; } for(int i = l*k; i < min((mid+1)*k, n); i++){ while(m[i].size() > 0){ if((m[i].back().first/k) >= mid){ int idx = m[i].back().second; h = 0; for(int y = mid*k; y < min((mid+1)*k, n); y++){ ns[idx] = min(ns[idx], dpl[h][i] + dpr[h][m[i].back().first]); h++; } m[i].pop_back(); }else{ break; } } } dnc(l, mid-1); dnc(mid+1, r); } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> k >> n >> e >> o; ns.resize(o, 2e9); g.resize(n); rg.resize(n); for(int i = 0; i < e; i++){ int u, v, t; cin >> u >> v >> t; g[u].push_back({v, t}); rg[v].push_back({u, t}); } m.resize(n); int co = 0; while(o--){ int a, b; cin >> a >> b; m[a].push_back({b, co}); co++; } for(int i = 0; i < n; i++){ sort(m[i].begin(), m[i].end()); } dpl.resize(k, vector<int>(n, 2e9)); dpr.resize(k, vector<int>(n, 2e9)); dnc(0, (n-1)/k); for(int i = 0; i < ns.size(); i++){ if(ns[i] == 2e9){ ns[i] = -1; } cout << ns[i] << "\n"; } 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...