제출 #528280

#제출 시각아이디문제언어결과실행 시간메모리
528280rainboyParkovi (COCI22_parkovi)C11
110 / 110
2310 ms34024 KiB
#include <stdio.h>
#include <stdlib.h>

#define N	200000
#define INF	0x3f3f3f3f3f3f3f3fLL

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

int ij[N - 1], ww[N - 1];
int *eh[N], eo[N];

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

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

long long dp[N], dq[N], r; int qu[N], cnt;

void dfs(int f, int i) {
	int o;

	dp[i] = INF, dq[i] = 0;
	for (o = eo[i]; o--; ) {
		int h = eh[i][o], j = i ^ ij[h];

		if (h != f) {
			dfs(h, j);
			dp[i] = min(dp[i], dp[j]), dq[i] = max(dq[i], dq[j]);
		}
	}
	if (dp[i] + dq[i] <= r)
		dq[i] = -INF;
	if (dq[i] != -INF && (f == -1 || dq[i] + ww[f] > r))
		qu[cnt++] = i, dp[i] = 0, dq[i] = -INF;
	if (dp[i] != INF && f != -1)
		dp[i] += ww[f];
	if (dq[i] != -INF && f != -1)
		dq[i] += ww[f];
}

int main() {
	static char used[N];
	int n, k, h, i, j;
	long long lower, upper;

	scanf("%d%d", &n, &k);
	for (i = 0; i < n; i++)
		eh[i] = (int *) malloc(2 * sizeof *eh[i]);
	for (h = 0; h < n - 1; h++) {
		scanf("%d%d%d", &i, &j, &ww[h]), i--, j--;
		ij[h] = i ^ j;
		append(i, h), append(j, h);
	}
	lower = -1, upper = INF;
	while (upper - lower > 1) {
		r = (lower + upper) / 2;
		cnt = 0, dfs(-1, 0);
		if (cnt <= k)
			upper = r;
		else
			lower = r;
	}
	r = upper;
	cnt = 0, dfs(-1, 0);
	k -= cnt;
	while (cnt--)
		used[qu[cnt]] = 1;
	for (i = 0; i < n && k > 0; i++)
		if (!used[i])
			used[i] = 1, k--;
	printf("%lld\n", upper);
	for (i = 0; i < n; i++)
		if (used[i])
			printf("%d ", i + 1);
	printf("\n");
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

Main.c: In function 'append':
Main.c:16:23: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
   16 |  if (o >= 2 && (o & o - 1) == 0)
      |                     ~~^~~
Main.c: In function 'main':
Main.c:50:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   50 |  scanf("%d%d", &n, &k);
      |  ^~~~~~~~~~~~~~~~~~~~~
Main.c:54:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   54 |   scanf("%d%d%d", &i, &j, &ww[h]), i--, j--;
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...