Submission #1194988

#TimeUsernameProblemLanguageResultExecution timeMemory
1194988Hamed_GhaffariToll (BOI17_toll)C++20
100 / 100
73 ms75080 KiB
#include <bits/stdc++.h>
using namespace std;

using pii = pair<int, int>;

#define X first
#define Y second
#define mins(a,b) (a = min(a,b))

const int MXN = 5e4+2, LOG = 16, MXK = 5, inf=1e9;

int k, n, m, q, rmq[LOG][MXN][MXK][MXK], ans[MXK][MXK], tmp[MXK][MXK];
vector<pii> g[MXN];

int32_t main() {
    cin.tie(0); cout.tie(0); ios_base::sync_with_stdio(0);
    int m, q;
    cin >> k >> n >> m >> q;
    for(int i=0,u,v,w; i<m; i++) {
        cin >> u >> v >> w;
        g[u].push_back({v, w});
    }
    for(int i=0; i+1<=(n-1)/k; i++) {
        for(int u=0; u<k; u++)
            fill(rmq[0][i][u], rmq[0][i][u]+k, inf);
        for(int u=i*k; u<(i+1)*k; u++)
            for(auto [v, w] : g[u])
                mins(rmq[0][i][u%k][v%k], w);
    }
    for(int i=1; i<LOG; i++)
        for(int j=0; j+(1<<i)<=(n-1)/k; j++) {
            for(int u=0; u<k; u++)
                fill(rmq[i][j][u], rmq[i][j][u]+k, inf);
            for(int u=0; u<k; u++)
                for(int v=0; v<k; v++)
                    for(int w=0; w<k; w++)
                        mins(rmq[i][j][u][w], rmq[i-1][j][u][v] + rmq[i-1][j+(1<<(i-1))][v][w]);
        }
    for(int u=0; u<k; u++)
        fill(tmp[u], tmp[u]+k, inf);
    while(q--) {
        int a, b;
        cin >> a >> b;
        int l = a/k, d = b/k-a/k;
        if(d==0) {
            cout << "-1\n";
            continue;
        }
        bool fir=1;
        while(d) {
            int i = __lg(d&-d);
            if(fir) {
                for(int u=0; u<k; u++)
                    for(int v=0; v<k; v++)
                        ans[u][v] = rmq[i][l][u][v];
                fir = 0;
            }
            else {
                for(int u=0; u<k; u++)
                    for(int v=0; v<k; v++)
                        for(int w=0; w<k; w++)
                            mins(tmp[u][w], ans[u][v] + rmq[i][l][v][w]);
                for(int u=0; u<k; u++)
                    for(int v=0; v<k; v++)
                        ans[u][v] = tmp[u][v],
                        tmp[u][v] = inf;
            }
            l += 1<<i;
            d ^= 1<<i;
        }
        int res = ans[a%k][b%k];
        cout << (res==inf ? -1 : res) << '\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...