Submission #544750

# Submission time Handle Problem Language Result Execution time Memory
544750 2022-04-02T16:26:43 Z rainboy Valley (BOI19_valley) C
100 / 100
228 ms 37452 KB
#include <stdio.h>
#include <stdlib.h>

#define N	100000
#define L	16	/* L = floor(log2(N)) */
#define INF	0x3f3f3f3f3f3f3f3fLL

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

int ii[N - 1], jj[N - 1], ww[N - 1];
int *oh[N], oo[N];

void append(int i, int h) {
	int o = oo[i]++;

	if (o >= 2 && (o & o - 1) == 0)
		oh[i] = (int *) realloc(oh[i], o * 2 * sizeof *oh[i]);
	oh[i][o] = h;
}

char shop[N]; int dd[N], pp[N][L + 1]; long long xx[N], xx_[N], yy[N][L + 1];

void dfs1(int p, int i, int d, long long x) {
	int o, l;

	dd[i] = d, xx[i] = x, xx_[i] = shop[i] ? x : INF;
	pp[i][0] = p;
	for (l = 1; 1 << l <= d; l++)
		pp[i][l] = pp[pp[i][l - 1]][l - 1];
	for (o = oo[i]; o--; ) {
		int h = oh[i][o], j = i ^ ii[h] ^ jj[h];

		if (j != p) {
			ii[h] = i, jj[h] = j, dfs1(i, j, d + 1, x + ww[h]);
			xx_[i] = min(xx_[i], xx_[j]);
		}
	}
}

void dfs2(int p, int i) {
	int o, l;

	yy[i][0] = xx_[i] == INF ? INF : xx_[i] - xx[i] * 2;
	for (l = 1; 1 << l <= dd[i]; l++)
		yy[i][l] = min(yy[i][l - 1], yy[pp[i][l - 1]][l - 1]);
	for (o = oo[i]; o--; ) {
		int h = oh[i][o], j = i ^ ii[h] ^ jj[h];

		if (j != p)
			dfs2(i, j);
	}
}

long long query(int i, int j) {
	int i_, l;
	long long y;

	if (dd[i] < dd[j])
		return -1;
	y = INF;
	for (i_ = i, l = L; l >= 0; l--)
		if (1 << l <= dd[i_] - dd[j])
			y = min(y, yy[i_][l]), i_ = pp[i_][l];
	if (i_ != j)
		return -1;
	y = min(y, yy[i_][0]);
	return y == INF ? INF : y + xx[i];
}

int main() {
	int n, k, q, r, h, i, j;

	scanf("%d%d%d%d", &n, &k, &q, &r), r--;
	for (i = 0; i < n; i++)
		oh[i] = (int *) malloc(2 * sizeof *oh[i]);
	for (h = 0; h < n - 1; h++) {
		int w;

		scanf("%d%d%d", &i, &j, &w), i--, j--;
		ii[h] = i, jj[h] = j, ww[h] = w;
		append(i, h), append(j, h);
	}
	while (k--) {
		scanf("%d", &i), i--;
		shop[i] = 1;
	}
	dfs1(-1, r, 0, 0);
	dfs2(-1, r);
	while (q--) {
		long long ans;

		scanf("%d%d", &h, &i), h--, i--;
		ans = query(i, jj[h]);
		if (ans == -1)
			printf("escaped\n");
		else if (ans == INF)
			printf("oo\n");
		else
			printf("%lld\n", ans);
	}
	return 0;
}

Compilation message

valley.c: In function 'append':
valley.c:16:23: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   16 |  if (o >= 2 && (o & o - 1) == 0)
      |                     ~~^~~
valley.c: In function 'main':
valley.c:73:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   73 |  scanf("%d%d%d%d", &n, &k, &q, &r), r--;
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
valley.c:79:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   79 |   scanf("%d%d%d", &i, &j, &w), i--, j--;
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~
valley.c:84:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   84 |   scanf("%d", &i), i--;
      |   ^~~~~~~~~~~~~~~
valley.c:92:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   92 |   scanf("%d%d", &h, &i), h--, i--;
      |   ^~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 5 ms 468 KB Output is correct
2 Correct 3 ms 468 KB Output is correct
3 Correct 3 ms 468 KB Output is correct
4 Correct 4 ms 440 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 468 KB Output is correct
2 Correct 3 ms 468 KB Output is correct
3 Correct 3 ms 468 KB Output is correct
4 Correct 4 ms 440 KB Output is correct
5 Correct 1 ms 596 KB Output is correct
6 Correct 1 ms 596 KB Output is correct
7 Correct 1 ms 556 KB Output is correct
8 Correct 1 ms 548 KB Output is correct
9 Correct 1 ms 560 KB Output is correct
10 Correct 1 ms 596 KB Output is correct
11 Correct 1 ms 596 KB Output is correct
12 Correct 1 ms 596 KB Output is correct
13 Correct 1 ms 556 KB Output is correct
14 Correct 1 ms 596 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 125 ms 32656 KB Output is correct
2 Correct 161 ms 32356 KB Output is correct
3 Correct 171 ms 32204 KB Output is correct
4 Correct 177 ms 34364 KB Output is correct
5 Correct 202 ms 34456 KB Output is correct
6 Correct 212 ms 37008 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 468 KB Output is correct
2 Correct 3 ms 468 KB Output is correct
3 Correct 3 ms 468 KB Output is correct
4 Correct 4 ms 440 KB Output is correct
5 Correct 1 ms 596 KB Output is correct
6 Correct 1 ms 596 KB Output is correct
7 Correct 1 ms 556 KB Output is correct
8 Correct 1 ms 548 KB Output is correct
9 Correct 1 ms 560 KB Output is correct
10 Correct 1 ms 596 KB Output is correct
11 Correct 1 ms 596 KB Output is correct
12 Correct 1 ms 596 KB Output is correct
13 Correct 1 ms 556 KB Output is correct
14 Correct 1 ms 596 KB Output is correct
15 Correct 125 ms 32656 KB Output is correct
16 Correct 161 ms 32356 KB Output is correct
17 Correct 171 ms 32204 KB Output is correct
18 Correct 177 ms 34364 KB Output is correct
19 Correct 202 ms 34456 KB Output is correct
20 Correct 212 ms 37008 KB Output is correct
21 Correct 110 ms 32080 KB Output is correct
22 Correct 138 ms 31724 KB Output is correct
23 Correct 174 ms 31492 KB Output is correct
24 Correct 172 ms 33972 KB Output is correct
25 Correct 200 ms 37452 KB Output is correct
26 Correct 113 ms 32116 KB Output is correct
27 Correct 128 ms 31784 KB Output is correct
28 Correct 139 ms 31632 KB Output is correct
29 Correct 209 ms 33276 KB Output is correct
30 Correct 228 ms 35096 KB Output is correct
31 Correct 113 ms 32144 KB Output is correct
32 Correct 137 ms 31876 KB Output is correct
33 Correct 142 ms 31796 KB Output is correct
34 Correct 208 ms 33936 KB Output is correct
35 Correct 204 ms 37324 KB Output is correct
36 Correct 186 ms 33820 KB Output is correct