Submission #1083160

#TimeUsernameProblemLanguageResultExecution timeMemory
1083160_8_8_Toll (BOI17_toll)C++17
100 / 100
403 ms26700 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 5e4 + 12, MOD = (int)1e9 + 7; int k, n, m, q, b; vector<pair<int,int>> g[N], o; vector<ll> di[N]; const int inf = 1e9 + 1; vector<ll> tr(vector<ll> prev,int l, int r) { vector<ll> ret(k,inf); assert(l % k == 0); for(int i = l; i <= r; i++) { int f = i % k; for(auto [to,w]:g[i]) { ret[to % k] = min(ret[to % k],prev[f] + w); } } return ret; } void prec() { for(int i = (int)o.size() - 1; i >= 0; i--) { if(i % b == 0) { int nx = i + b; int l = o[i].first, r = o[i].second; for(int j = l; j <= r; j++) { vector<ll> dd(k,inf); dd[j%k] = 0; // cout << j << '\n'; for(int _i = i + 1; _i < (int)o.size(); _i++) { vector<ll> nv = tr(dd,o[_i - 1].first,o[_i - 1].second); for(auto f:nv) { di[j].push_back(f); // cout << f << ' '; } dd = nv; } // cout << "_____________\n"; } } } } void test() { cin >> k >> n >> m >> q; for(int i = 1; i <= m; i++) { int a, b, c; cin >> a >> b >> c; g[a].push_back({b,c}); } for(int i = 0; i <= n; i++) { int l = i * k, r = (i + 1) * k - 1; if(l >= n) break; if(r >= n) { r = n - 1; } o.push_back({l,r}); } for(int i = 0; i < n; i++) { sort(g[i].begin(),g[i].end()); vector<pair<int,int>> nv; for(auto [x,y]:g[i]) { if(nv.empty() || nv.back().first != x) { nv.emplace_back(x,y); } } g[i].swap(nv); assert((int)g[i].size() <= k); } b = 600; // b = 1; prec(); // return; while(q--) { int a, r; cin >> a >> r; if(a / k >= r / k) { cout << -1 << '\n'; continue; } int x = a / k, y = r / k; vector<ll> cur(k,inf); cur[a%k] = 0; while(x % b != 0) { x++; cur = tr(cur,o[x - 1].first,o[x - 1].second); if(x == y) { break; } } ll res = inf; if(x == y) { res = cur[r % k]; } else { for(int i = 0; i < k; i++) { int nx = (x + 1) * k; res = min(res,di[o[x].first + i][r - nx] + cur[i]); } } if(res == inf) res = -1; cout << res << '\n'; } } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int t = 1; // cin >> t; while(t--) test(); return 0; }

Compilation message (stderr)

toll.cpp: In function 'void prec()':
toll.cpp:26:17: warning: unused variable 'nx' [-Wunused-variable]
   26 |             int nx = i + b;
      |                 ^~
#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...