Submission #1176375

#TimeUsernameProblemLanguageResultExecution timeMemory
1176375minhpkToll (BOI17_toll)C++20
0 / 100
164 ms75576 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
 
const ll INF = 1e14;
 
vector<vector<ll>> multiply(const vector<vector<ll>> &A, const vector<vector<ll>> &B, int k) {
    vector<vector<ll>> C(k, vector<ll>(k, INF));
    for (int i = 0; i < k; i++) {
        for (int j = 0; j < k; j++) {
            for (int s = 0; s < k; s++) {
                C[i][j] = min(C[i][j], A[i][s] + B[s][j]);
            }
        }
    }
    return C;
}
 
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
 
    int k, a, m, q;
    cin >> k >> a >> m >> q;
    int blocks = (a + k - 1) / k;
    vector<vector<vector<ll>>> mat(blocks, vector<vector<ll>>(k, vector<ll>(k, INF)));
    for (int i = 0; i < blocks; i++){
        for (int j = 0; j < k; j++){
            mat[i][j][j] = 0;
        }
    }
 
    for (int i = 0; i < m; i++){
        ll x, y, t;
        cin >> x >> y >> t;
        ll bx = x / k, by = y / k;
        if (by == bx + 1) {
            mat[bx][x % k][y % k] = min(mat[bx][x % k][y % k], t);
        }
    }
 
    int L = floor(log2(blocks)) + 1;
    vector<vector<vector<vector<ll>>>> st(blocks, vector<vector<vector<ll>>>(L, vector<vector<ll>>(k, vector<ll>(k, INF))));
 
    for (int i = 0; i < blocks; i++){
        st[i][0] = mat[i];
    }
 
    for (int l = 1; l < L; l++){
        for (int i = 0; i + (1 << l) <= blocks; i++){
            st[i][l] = multiply(st[i][l-1], st[i + (1 << (l-1))][l-1], k);
        }
    }
 
    while(q--){
        ll x, y;
        cin >> x >> y;
        ll bx = x / k, by = y / k;
        if (bx == by) {
            cout << -1 << "\n";
            continue;
        }
 
        vector<vector<ll>> res(k, vector<ll>(k, INF));
        for (int i = 0; i < k; i++){
            res[i][i] = 0;
        }
 
        int idx = bx; 
        int remain = by - bx;
 
        for (int p = L - 1; p >= 0; p--){
            if ((1 << p) <= remain) {
                res = multiply(res, st[idx][p], k);
                idx += (1 << p);
                remain -= (1 << p);
            }
        }
 
        ll ans = res[x % k][y % k];
        if (ans >= INF) cout << -1 << "\n";
        else cout << ans << "\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...