Submission #1236988

#TimeUsernameProblemLanguageResultExecution timeMemory
1236988ssitaramToll (BOI17_toll)C++20
7 / 100
171 ms46516 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef long double ld;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	int k, n, m, o; cin >> k >> n >> m >> o;
	vector<vector<vector<int>>> dist(n, vector<vector<int>>(16, vector<int>(k, 1e9)));
	for (int i = 0; i < m; ++i) {
		int a, b, t; cin >> a >> b >> t;
		dist[a][0][b % k] = t;
	}
	for (int i = 1; i < 16; ++i) {
		for (int a = 0; a < n; ++a) {
			for (int b = 0; b < k; ++b) {
				for (int c = 0; c < k; ++c) {
					if ((a / k + (1 << (i - 1))) * k + b < n)
					dist[a][i][c] = min(dist[a][i][c], dist[a][i - 1][b] + dist[(a / k + (1 << (i - 1))) * k + b][i - 1][c]);
				}
			}
		}
	}
	while (o--) {
		int a, b; cin >> a >> b;
		int d = b / k - a / k;
		vector<pair<int, int>> places = {{a, 0}};
		for (int i = 0; i < 16; ++i) {
			if (d & (1 << i)) {
				vector<pair<int, int>> nplaces;
				for (pair<int, int> fr : places) {
					for (int j = 0; j < k; ++j) {
						nplaces.push_back({(fr.first / k + (1 << i)) * k + j, min(fr.second + dist[fr.first][i][j], (int) 1e9)});
					}
				}
				places = nplaces;
			}
		}
		int ans = 1e9;
		for (pair<int, int> i : places) {
			if (i.first == b) {
				ans = i.second;
			}
		}
		cout << (ans == 1e9 ? -1 : 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...