Submission #567697

# Submission time Handle Problem Language Result Execution time Memory
567697 2022-05-24T04:59:41 Z _karan_gandhi Toll (BOI17_toll) C++17
100 / 100
169 ms 198832 KB
#include <bits/stdc++.h>
using namespace std;

#define all(v) v.begin(), v.end()
#define endl '\n'
#define pl(var) " [" << #var << ": " << (var) << "] "
#define ll long long

void solve() {
	ll int k, n, m, o; cin >> k >> n >> m >> o;

	const ll int LOG = 20;
	// dp[i][i + 2 ^ k][x][y];
	ll int dp[n / k][LOG][5][5];
	memset(dp, 1, sizeof dp);

	vector<vector<pair<ll int, ll int>>> adj(n);

	for (ll int i = 0; i < m; i++) {
		ll int a, b; cin >> a >> b;
		ll int c; cin >> c;

		adj[a].emplace_back(b, c);
	}

	for (ll int i = 0; i < n; i++) {
		for (auto [v, wt] : adj[i]) {
			dp[i / k][0][i % k][v % k] = wt;
		}
	}

	auto combine = [&](ll int target[5][5], ll int a[5][5], ll int b[5][5]) {
		for (ll int i = 0; i < k; i++) {
			for (ll int j = 0; j < k; j++) {
				for (ll int l = 0; l < k; l++) {
					target[i][j] = min(target[i][j], a[i][l] + b[l][j]);
				}
			}
		}
	};

	for (ll int i = 1; i < LOG; i++) {
		for (ll int j = 0; j < (n + k - 1) / k; j++) {
			if (j + (1 << (i - 1)) >= n / k) continue;
			combine(dp[j][i], dp[j][i - 1], dp[j + (1 << (i - 1))][i - 1]);
		}
	}

	// TODO: write query again

	auto query = [&](ll int start, ll int end) {
		ll int res[5][5];
		memset(res, 1, sizeof res);
		for (int i = 0; i < 5; i++) res[i][i] = 0;
		ll int level = start / k;
		ll int target = end / k;
		int pow = LOG;

		while (level != target) {
			while (level + (1 << pow) > target) pow--;
	
			ll int new_res[5][5];
			memset(new_res, 1, sizeof new_res);

			combine(new_res, res, dp[level][pow]);
			memcpy(res, new_res, sizeof res);

			level += (1 << pow);
		}

		return res[start % k][end % k];
	};

	while (o--) {
		int a, b; cin >> a >> b;

		ll int res = query(a, b);

		if (res > 1e16) cout << -1 << endl;
		else cout << res << endl;
	}
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	ll int T = 1;
	// cin >> T;
	while (T--)
		solve();
}
# Verdict Execution time Memory Grader output
1 Correct 138 ms 198832 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 3 ms 4180 KB Output is correct
6 Correct 3 ms 4180 KB Output is correct
7 Correct 2 ms 4180 KB Output is correct
8 Correct 169 ms 198660 KB Output is correct
9 Correct 146 ms 198764 KB Output is correct
10 Correct 142 ms 197100 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 123 ms 101864 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 0 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 1 ms 212 KB Output is correct
7 Correct 6 ms 4308 KB Output is correct
8 Correct 6 ms 2388 KB Output is correct
9 Correct 136 ms 198732 KB Output is correct
10 Correct 121 ms 70732 KB Output is correct
11 Correct 113 ms 101940 KB Output is correct
12 Correct 103 ms 68728 KB Output is correct
13 Correct 83 ms 29132 KB Output is correct
14 Correct 63 ms 42736 KB Output is correct
15 Correct 52 ms 26476 KB Output is correct
16 Correct 56 ms 26412 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 2 ms 4180 KB Output is correct
7 Correct 2 ms 2260 KB Output is correct
8 Correct 2 ms 1236 KB Output is correct
9 Correct 2 ms 1364 KB Output is correct
10 Correct 130 ms 198788 KB Output is correct
11 Correct 109 ms 101764 KB Output is correct
12 Correct 131 ms 70600 KB Output is correct
13 Correct 111 ms 71056 KB Output is correct
14 Correct 126 ms 69804 KB Output is correct
15 Correct 62 ms 26508 KB Output is correct
16 Correct 50 ms 26400 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 1 ms 212 KB Output is correct
4 Correct 0 ms 212 KB Output is correct
5 Correct 0 ms 212 KB Output is correct
6 Correct 2 ms 4180 KB Output is correct
7 Correct 2 ms 2260 KB Output is correct
8 Correct 2 ms 1236 KB Output is correct
9 Correct 2 ms 1364 KB Output is correct
10 Correct 130 ms 198788 KB Output is correct
11 Correct 109 ms 101764 KB Output is correct
12 Correct 131 ms 70600 KB Output is correct
13 Correct 111 ms 71056 KB Output is correct
14 Correct 126 ms 69804 KB Output is correct
15 Correct 62 ms 26508 KB Output is correct
16 Correct 50 ms 26400 KB Output is correct
17 Correct 104 ms 101848 KB Output is correct
18 Correct 1 ms 340 KB Output is correct
19 Correct 0 ms 212 KB Output is correct
20 Correct 1 ms 212 KB Output is correct
21 Correct 0 ms 212 KB Output is correct
22 Correct 0 ms 212 KB Output is correct
23 Correct 4 ms 4180 KB Output is correct
24 Correct 3 ms 2388 KB Output is correct
25 Correct 5 ms 1236 KB Output is correct
26 Correct 6 ms 1364 KB Output is correct
27 Correct 126 ms 198744 KB Output is correct
28 Correct 119 ms 70628 KB Output is correct
29 Correct 130 ms 71092 KB Output is correct
30 Correct 108 ms 69872 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 138 ms 198832 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 3 ms 4180 KB Output is correct
6 Correct 3 ms 4180 KB Output is correct
7 Correct 2 ms 4180 KB Output is correct
8 Correct 169 ms 198660 KB Output is correct
9 Correct 146 ms 198764 KB Output is correct
10 Correct 142 ms 197100 KB Output is correct
11 Correct 123 ms 101864 KB Output is correct
12 Correct 0 ms 340 KB Output is correct
13 Correct 0 ms 212 KB Output is correct
14 Correct 0 ms 212 KB Output is correct
15 Correct 0 ms 212 KB Output is correct
16 Correct 1 ms 212 KB Output is correct
17 Correct 6 ms 4308 KB Output is correct
18 Correct 6 ms 2388 KB Output is correct
19 Correct 136 ms 198732 KB Output is correct
20 Correct 121 ms 70732 KB Output is correct
21 Correct 113 ms 101940 KB Output is correct
22 Correct 103 ms 68728 KB Output is correct
23 Correct 83 ms 29132 KB Output is correct
24 Correct 63 ms 42736 KB Output is correct
25 Correct 52 ms 26476 KB Output is correct
26 Correct 56 ms 26412 KB Output is correct
27 Correct 1 ms 340 KB Output is correct
28 Correct 1 ms 212 KB Output is correct
29 Correct 1 ms 212 KB Output is correct
30 Correct 0 ms 212 KB Output is correct
31 Correct 0 ms 212 KB Output is correct
32 Correct 2 ms 4180 KB Output is correct
33 Correct 2 ms 2260 KB Output is correct
34 Correct 2 ms 1236 KB Output is correct
35 Correct 2 ms 1364 KB Output is correct
36 Correct 130 ms 198788 KB Output is correct
37 Correct 109 ms 101764 KB Output is correct
38 Correct 131 ms 70600 KB Output is correct
39 Correct 111 ms 71056 KB Output is correct
40 Correct 126 ms 69804 KB Output is correct
41 Correct 62 ms 26508 KB Output is correct
42 Correct 50 ms 26400 KB Output is correct
43 Correct 104 ms 101848 KB Output is correct
44 Correct 1 ms 340 KB Output is correct
45 Correct 0 ms 212 KB Output is correct
46 Correct 1 ms 212 KB Output is correct
47 Correct 0 ms 212 KB Output is correct
48 Correct 0 ms 212 KB Output is correct
49 Correct 4 ms 4180 KB Output is correct
50 Correct 3 ms 2388 KB Output is correct
51 Correct 5 ms 1236 KB Output is correct
52 Correct 6 ms 1364 KB Output is correct
53 Correct 126 ms 198744 KB Output is correct
54 Correct 119 ms 70628 KB Output is correct
55 Correct 130 ms 71092 KB Output is correct
56 Correct 108 ms 69872 KB Output is correct
57 Correct 129 ms 54808 KB Output is correct
58 Correct 136 ms 198652 KB Output is correct
59 Correct 121 ms 101936 KB Output is correct