Submission #135824

#TimeUsernameProblemLanguageResultExecution timeMemory
135824popovicirobertToll (BOI17_toll)C++14
100 / 100
247 ms13176 KiB
#include <bits/stdc++.h> #define lsb(x) (x & (-x)) #define ll long long #define ull unsigned long long // 217 // 44 /*const int MOD = (int) 1e9 + 7; inline int lgput(int a, int b) { int ans = 1; while(b > 0) { if(b & 1) ans = (1LL * ans * a) % MOD; b >>= 1; a = (1LL * a * a) % MOD; } return ans; } inline void mod(int &x) { if(x >= MOD) x -= MOD; } inline void add(int &x, int y) { x += y; mod(x); } inline void sub(int &x, int y) { x += MOD - y; mod(x); } inline void mul(int &x, int y) { x = (1LL * x * y) % MOD; }*/ /*int fact[], invfact[]; inline void prec(int n) { fact[0] = 1; for(int i = 1; i <= n; i++) { fact[i] = (1LL * fact[i - 1] * i) % MOD; } invfact[n] = lgput(fact[n], MOD - 2); for(int i = n - 1; i >= 0; i--) { invfact[i] = (1LL * invfact[i + 1] * (i + 1)) % MOD; } } inline int comb(int n, int k) { if(n < k) return 0; return (1LL * fact[n] * (1LL * invfact[k] * invfact[n - k] % MOD)) % MOD; }*/ using namespace std; const int MAXN = 50000; const int INF = 1e9; vector < pair <int, int> > gl[MAXN + 1], gr[MAXN + 1]; vector < pair <int, int> > qry[MAXN + 1]; int a[MAXN + 1], b[MAXN + 1]; int dpl[MAXN + 1], dpr[MAXN + 1]; int sol[MAXN + 1], k; void divide(int l, int r) { if(l == r) { return ; } int mid = (l + r) / 2; for(int nod = max(mid - k, l); nod <= min(mid + k, r); nod++) { dpr[nod] = 0; for(int i = nod + 1; i <= r; i++) { dpr[i] = INF; for(auto it : gr[i]) { if(it.first >= nod) { dpr[i] = min(dpr[i], dpr[it.first] + it.second); } } } dpl[nod] = 0; for(int i = nod - 1; i >= l; i--) { dpl[i] = INF; for(auto it : gl[i]) { if(it.first <= nod) { dpl[i] = min(dpl[i], dpl[it.first] + it.second); } } } for(int i = l; i <= nod; i++) { int pos = (int) qry[i].size() - 1; while(pos >= 0 && qry[i][pos].first >= nod) { sol[qry[i][pos].second] = min(sol[qry[i][pos].second], dpl[i] + dpr[qry[i][pos].first]); pos--; } } } for(int i = l; i <= mid; i++) { while(qry[i].size() && qry[i].back().first > mid) { qry[i].pop_back(); } } divide(l, mid); divide(mid + 1, r); } int main() { //ifstream cin("A.in"); //ofstream cout("A.out"); int i, n, m, o; ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); cin >> k >> n >> m >> o; for(i = 1; i <= m; i++) { int x, y, z; cin >> x >> y >> z; x++, y++; gr[y].push_back({x, z}); gl[x].push_back({y, z}); } for(i = 1; i <= o; i++) { cin >> a[i] >> b[i]; a[i]++, b[i]++; qry[a[i]].push_back({b[i], i}); sol[i] = INF; } for(i = 1; i <= n; i++) { sort(qry[i].begin(), qry[i].end()); } divide(1, n); for(i = 1; i <= o; i++) { if(sol[i] == INF) { sol[i] = -1; } cout << sol[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...