제출 #1273595

#제출 시각아이디문제언어결과실행 시간메모리
1273595_filya_Toll (BOI17_toll)C++20
100 / 100
111 ms71540 KiB
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int N = 5e4 + 50;
const ll inf = 1e10;

vector<vector<ll>> dat[20][N];
ll mask[N];
vector<array<int, 3>> G[N];
int k, n, m, q;

vector<vector<ll>> I() {
    vector<vector<ll>> res(k, vector<ll>(k, inf));
    for (int i = 0; i < k; i++) res[i][i] = 0;
    return res;
} 

void divide(int l, int r, int lvl) {
    if (l == r) return;
    int m = (r + l) / 2;
    dat[lvl][m] = I();
    for (int i = m - 1; i >= l; i--) {
        dat[lvl][i].assign(k, vector<ll>(k, inf));
        for (int x = 0; x < k; x++) {
            for (auto u : G[i]) {
                dat[lvl][i][u[0]][x] = min(dat[lvl][i][u[0]][x], dat[lvl][i + 1][u[1]][x] + u[2]);
            }
        }
       
    }
    for (int i = m + 1; i <= r; i++) {
        dat[lvl][i].assign(k, vector<ll>(k, inf));
        for (int x = 0; x < k; x++) {
            for (auto u : G[i - 1]) {
                dat[lvl][i][u[1]][x] = min(dat[lvl][i][u[1]][x], dat[lvl][i - 1][u[0]][x] + u[2]);
            }
        }
    }
    for (int i = m + 1; i <= r; i++) mask[i] ^= (1 << lvl);
    divide(l, m, lvl + 1); divide(m + 1, r, lvl + 1);
}

int main()
{
// 	ifstream cin("input.txt");
//     ofstream cout("output.txt");
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	cin >> k >> n >> m >> q;
    n = (n + k - 1) / k * k;
    for (int i = 0; i < m; i++) {
        int a, b, t; cin >> a >> b >> t;
        G[a / k].push_back({a % k, b % k, t});
    }
    divide(0, n / k - 1, 0);
    while(q--) {
        int a, b; cin >> a >> b;
        if (a / k == b / k) {
            cout << "-1\n";
        } else {
            int lvl = __builtin_ctz(mask[a / k] ^ mask[b / k]);
            ll ans = inf;
            for (int x = 0; x < k; x++) ans = min(ans, dat[lvl][a / k][a % k][x] + dat[lvl][b / k][b % k][x]);
            cout << (ans == inf ? -1 : ans) << '\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...