Submission #1318621

#TimeUsernameProblemLanguageResultExecution timeMemory
1318621vaishakhvToll (BOI17_toll)C++20
0 / 100
219 ms145532 KiB
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define eb emplace_back // faster than push_back xD

// pbds UwU
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
#define oset tree<ll, null_type,less<ll>, rb_tree_tag,tree_order_statistics_node_update> // use pair for ms

// my io library :D
#define m1(x) template<class T, class... U> void x(T&& a, U&&... b)
#define m2(x) (ll[]){(x forward<U>(b),0)...}

m1(pr){cout << forward<T>(a);  m2(cout << " " <<); cout << "\n";}
m1(re){cin >> forward<T>(a); m2(cin >>);}

const ll cap = 5e4+1;
ll dist[cap], k;
vector<pair<ll,ll>> adj[cap];
vector<tuple<ll,ll,ll>> adj_by_layer[cap];

/*
void dijkstra(ll s){
    priority_queue<pair<ll,ll>> pq;
    fill(dist, dist+cap, 1e18);
    pq.push({0, s});
    dist[s] = 0;

    while (!pq.empty()){
        pair<ll,ll> oknext = pq.top(); pq.pop();
        oknext.first *= -1;
        for (auto u: adj[oknext.second]){
            if (dist[oknext.second] + u.second < dist[u.first]){
                dist[u.first] = dist[oknext.second] + u.second;
                pq.push({-dist[u.first], u.first});
            }    
        }   
    }
}
*/

ll layer(ll a){
    return a/k;
}

int main() {
	ios::sync_with_stdio(0);
    cin.tie(0);

    ll n, m, o;
    re(k, n, m, o);

    for (ll i{}; i < m; i++){
        ll a, b, t; re(a, b, t);
        adj[a].eb(make_pair(b, t));
        adj_by_layer[layer(a)].eb(make_tuple(a,b,t));
    }

    ll nolayers = (n+k-1)/k;
    ll lastsz = n - k*(nolayers-1), log = ceil(log2(nolayers)); 

    vector<vector<vector<vector<ll>>>> up(nolayers, vector<vector<vector<ll>>>(32, vector<vector<ll>>(k, vector<ll>(k, 1e18))));

    for (ll i{}; i < nolayers; i++) {
        for (auto tup :adj_by_layer[i]) {
            ll a, b, t; tie(a, b, t) = tup;
            ll x = a % k, y = b % k;
            up[i][0][x][y] = min(up[i][0][x][y], t);
        }
    }


    for (ll i{}; i < nolayers; i++){
        for (ll j = 1; j < log; j++){
            if (i + (1LL<<j) >= nolayers) continue;
            ll xlim = (i == nolayers - 1 ? lastsz : k);
            ll ylim = (i + ((1LL<<j)) == nolayers - 1 ? lastsz : k);
            ll nexlim = ((i + (1LL<<(j-1)) == nolayers-1) ? lastsz : k);
            for (ll x{}; x < xlim; x++){
                for (ll y{}; y < ylim; y++){                    
                    for (ll mid{}; mid < nexlim; mid++){
                        up[i][j][x][y] = min(up[i][j][x][y], up[i][j-1][x][mid] + up[(1LL<<(j-1))+i][j-1][mid][y]);
                    }
                }
            }
        }
    }

    for (ll i{}; i < o; i++){
        ll a, b; re(a, b);
        ll la = layer(a), lb = layer(b);
        ll diff = lb - la, curl = la;
        vector<ll> cur(k, 1e18);
        cur[a%k] = 0;
        
        ll ans = 0;
        for (ll j{}; j < log; j++){
            if (diff & ((1LL<<j))){
                ll curlsz = (curl == nolayers-1 ? lastsz : k);
                ll nexsz = (curl + ((1LL<<j)) == nolayers-1 ? lastsz : k);
                vector<ll> nex(nexsz, 1e18);
                for (ll x{}; x < curlsz; x++){
                    for (ll y{}; y < nexsz; y++){
                        nex[y] = min(nex[y], cur[x] + up[curl][j][x][y]);
                    }
                }
                cur = nex;
                curl += ((1LL<<j));
            }            
        }

        ans = cur[b%k];
        if (ans == (ll)1e18) pr(-1);
        else pr(ans);
    }
}
#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...