Submission #308068

#TimeUsernameProblemLanguageResultExecution timeMemory
308068Vince729Toll (BOI17_toll)C++11
100 / 100
171 ms91768 KiB
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
#include<cstring>
#include<algorithm>
using namespace std;

const int MAXN = 50002;
const int MAXK = 5;
const int MOD = 1000000007;

int K, N, M, O;
int dp[MAXN][18][MAXK][MAXK];
int ans[MAXK][MAXK], tmp[MAXK][MAXK];

void minimize(int x[MAXK][MAXK], int a[MAXK][MAXK], int b[MAXK][MAXK]) {
    for (int i = 0; i < K; i++) {
        for (int j = 0; j < K; j++) {
            for (int k = 0; k < K; k++) {
                x[i][j] = min(x[i][j], a[i][k]+b[k][j]);
            }
        }
    }
}

int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> K >> N >> M >> O;
    memset(dp, 0x3f, sizeof dp);
    for (int i = 0; i < M; i++) {
        int a, b, t;
        cin >> a >> b >> t;
        dp[a/K][0][a%K][b%K] = t;
    }
    for (int i = 1; i < 18; i++) {
        for (int j = 0; j < (N+K-1)/K-(1<<i); j++) {
            minimize(dp[j][i], dp[j][i-1], dp[j+(1<<(i-1))][i-1]);
        }
    }
    for (int o = 0; o < O; o++) {
        int a, b; cin >> a >> b;
        memset(ans, 0x3f, sizeof ans);
        for (int i = 0; i < K; i++) ans[i][i] = 0;
        int cur = a/K, dest = b/K;
        for (int i = 17; i >= 0; i--) {
            if (cur + (1<<i) <= dest) {
                memset(tmp, 0x3f, sizeof tmp);
                minimize(tmp, ans, dp[cur][i]);
                memcpy(ans, tmp, sizeof ans);
                cur += (1<<i);
            }
        }
        if (ans[a%K][b%K] == 0x3f3f3f3f) cout << -1;
        else cout << ans[a%K][b%K]; 
        cout << "\n";
    }
}
#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...