Submission #544732

#TimeUsernameProblemLanguageResultExecution timeMemory
544732rainboyToll (BOI17_toll)C11
100 / 100
85 ms15924 KiB
#include <stdio.h>

#define N	50000
#define K	5
#define Q	10000
#define INF	0x3f3f3f3f

int min(int a, int b) { return a < b ? a : b; }

int dd[N][K][K], ii[Q], jj[Q], ans[Q], k;

void solve(int *hh, int l, int r, int q) {
	static int dd1[N][K][K], dd2[N][K][K];
	int m, h, hl, hm, hr, i, j, a, b, c, tmp;

	if (q == 0)
		return;
	m = (l + r) / 2;
	hl = 0, hm = 0, hr = q;
	while (hm < hr)
		if (ii[hh[hm]] / k <= m && m <= jj[hh[hm]] / k)
			hm++;
		else if (jj[hh[hm]] / k < m) {
			tmp = hh[hl], hh[hl] = hh[hm], hh[hm] = tmp;
			hl++, hm++;
		} else {
			hr--;
			tmp = hh[hm], hh[hm] = hh[hr], hh[hr] = tmp;
		}
	for (i = l; i <= m; i++)
		for (a = 0; a < k; a++)
			for (b = 0; b < k; b++)
				dd1[i][a][b] = INF;
	for (i = m; i <= r; i++)
		for (a = 0; a < k; a++)
			for (b = 0; b < k; b++)
				dd2[i][a][b] = INF;
	for (a = 0; a < k; a++)
		dd1[m][a][a] = dd2[m][a][a] = 0;
	for (i = m; i > l; i--)
		for (a = 0; a < k; a++)
			for (b = 0; b < k; b++) {
				int x = dd1[i][a][b];

				if (x != INF)
					for (c = 0; c < k; c++)
						dd1[i - 1][c][b] = min(dd1[i - 1][c][b], dd[i - 1][c][a] + x);
			}
	for (i = m; i < r; i++)
		for (a = 0; a < k; a++)
			for (b = 0; b < k; b++) {
				int x = dd2[i][a][b];

				if (x != INF)
					for (c = 0; c < k; c++)
						dd2[i + 1][a][c] = min(dd2[i + 1][a][c], x + dd[i][b][c]);
			}
	for (h = hl; h < hr; h++) {
		int h_ = hh[h], x;

		i = ii[h_] / k, a = ii[h_] % k, j = jj[h_] / k, b = jj[h_] % k;
		x = INF;
		for (c = 0; c < k; c++)
			x = min(x, dd1[i][a][c] + dd2[j][c][b]);
		ans[h_] = x;
	}
	solve(hh, l, m - 1, hl);
	solve(hh + hr, m + 1, r, q - hr);
}

int main() {
	static int hh[Q];
	int n, m, q, h, i, j, a, b;

	scanf("%d%d%d%d", &k, &n, &m, &q), n = (n + k - 1) / k;
	for (i = 0; i + 1 < n; i++)
		for (a = 0; a < k; a++)
			for (b = 0; b < k; b++)
				dd[i][a][b] = INF;
	while (m--) {
		int d;

		scanf("%d%d%d", &i, &j, &d);
		dd[i / k][i % k][j % k] = d;
	}
	for (h = 0; h < q; h++) {
		scanf("%d%d", &ii[h], &jj[h]);
		hh[h] = h;
	}
	solve(hh, 0, n - 1, q);
	for (h = 0; h < q; h++)
		printf("%d\n", ans[h] == INF ? -1 : ans[h]);
	return 0;
}

Compilation message (stderr)

toll.c: In function 'main':
toll.c:75:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   75 |  scanf("%d%d%d%d", &k, &n, &m, &q), n = (n + k - 1) / k;
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
toll.c:83:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   83 |   scanf("%d%d%d", &i, &j, &d);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~
toll.c:87:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   87 |   scanf("%d%d", &ii[h], &jj[h]);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...