제출 #1370589

#제출 시각아이디문제언어결과실행 시간메모리
1370589kaiboyDesignated Cities (JOI19_designated_cities)C++20
23 / 100
2094 ms18536 KiB
#include <algorithm>
#include <iostream>

using namespace std;

const       int   N = 200000;
const long long INF = 0x3f3f3f3f3f3f3f3fLL;

int *ej[N], *ew[N], eo[N];
long long ss[N], s_, ans[N + 1];
bool used[N]; int qu[N];

void append(int i, int j, int w) {
	int o = eo[i]++;
	if (!o) {
		ej[i] = (int *) malloc(sizeof *ej[i]);
		ew[i] = (int *) malloc(sizeof *ew[i]);
	} else {
		ej[i] = (int *) realloc(ej[i], (o << 1) * sizeof *ej[i]);
		ew[i] = (int *) realloc(ew[i], (o << 1) * sizeof *ew[i]);
	}
	ej[i][o] = j;
	ew[i][o] = w;
}

void dfs(int p, int i, long long s) {
	ss[i] = s;
	for (int o = 0; o < eo[i]; o++) {
		int j = ej[i][o], w = ew[i][o];
		if (j != p)
			s_ += w, dfs(i, j, s + w);
	}
}

bool dfs_(int p, int i, int t) {
	if (i == t) {
		used[i] = true;
		return true;
	}
	for (int o = 0; o < eo[i]; o++) {
		int j = ej[i][o];
		if (j != p && dfs_(i, j, t)) {
			used[i] = true;
			return true;
		}
	}
	return false;
}

int main() {
	ios_base::sync_with_stdio(false), cin.tie(NULL);
	int n; cin >> n;
	for (int h = 0; h < n - 1; h++) {
		int i, j, w, w_; cin >> i >> j >> w >> w_, i--, j--;
		append(i, j, w), append(j, i, w_);
	}
	long long x_ = ans[1] = INF; int s = -1, t = -1;
	for (int i = 0; i < n; i++) {
		s_ = 0, dfs(-1, i, 0);
		ans[1] = min(ans[1], s_);
		for (int j = 0; j < n; j++) {
			long long x = s_ - ss[j];
			if (x_ > x)
				x_ = x, s = i, t = j;
		}
	}
	ans[2] = x_;
	dfs_(-1, s, t);
	for (int k = 3; k <= n; k++) {
		for (int i = 0; i < n; i++)
			ss[i] = INF;
		int cnt = 0;
		for (int i = 0; i < n; i++)
			if (used[i])
				ss[qu[cnt++] = i] = 0;
		for (int head = 0; head < cnt; head++) {
			int i = qu[head];
			for (int o = 0; o < eo[i]; o++) {
				int j = ej[i][o], w = ew[i][o];
				if (ss[j] == INF)
					ss[qu[cnt++] = j] = ss[i] + w;
			}
		}
		int i_ = 0;
		for (int i = 1; i < n; i++)
			if (ss[i_] < ss[i])
				i_ = i;
		ans[k] = x_ -= ss[i_];
		dfs_(-1, i_, t);
	}
	int q; cin >> q;
	while (q--) {
		int k; cin >> k;
		cout << ans[k] << '\n';
	}
	return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…