Submission #1045860

#TimeUsernameProblemLanguageResultExecution timeMemory
1045860alex_2008Petrol stations (CEOI24_stations)C++14
36 / 100
3577 ms8824 KiB
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <set>
typedef long long ll;
using namespace std;
const int N = 70070;
ll cnt[N];
int subtree[N];
ll pref[N];
ll people[N];
vector <vector<pair<int, int>>> G;
int n, k;
void dfs_0(int v, int p) {
	subtree[v] = 1;
	for (auto it : G[v]) {
		if (it.first == p) continue;
		dfs_0(it.first, v);
		subtree[v] += subtree[it.first];
	}
}
void dfs(int v, int p, int depth) {
	for (auto it : G[v]) {
		if (it.first == p) continue;
		int c = depth + it.second;
		if (c <= k) dfs(it.first, v, c);
		else {
			cnt[v] += subtree[it.first];
			dfs(it.first, v, it.second);
		}
	}
}
void f(vector <int> indd, vector <int> len) {
	indd.insert(indd.begin(), 0);
	len.insert(len.begin(), 0);
	for (int i = 1; i < n; i++) {
		pref[i] = pref[i - 1] + len[i];
	}
	for (int i = 1; i <= n; i++) {
		people[i] = 1;
	}
	for (int i = 1; i <= n; i++) {
		if ((pref[n - 1] - pref[i - 1]) <= k) continue;
		int ind = upper_bound(pref + 1, pref + n, pref[i - 1] + k) - pref;
		people[ind] += people[i];
		cnt[indd[ind]] += (people[i] * 1ll * (n - ind));
	}
}
int main() {
	cin >> n >> k;
	G.resize(n + 1);
	for (int i = 1; i < n; i++) {
		int a, b, c;
		cin >> a >> b >> c;
		a++; b++;
		G[a].push_back({ b, c });
		G[b].push_back({ a, c });
	}
	if (n <= 1000) {
		for (int i = 1; i <= n; i++) {
			dfs_0(i, i);
			dfs(i, i, 0);
		}
		for (int i = 1; i <= n; i++) {
			cout << cnt[i] << "\n";
		}
		return 0;
	}
	vector <int> ind;
	vector <int> len;
	for (int i = 1; i <= n; i++) {
		if ((int)G[i].size() == 1) {
			ind.push_back(i);
			break;
		}
	}
	while ((int)ind.size() != n) {
		int v = ind.back(), p = -1;
		if ((int)ind.size() != 1) p = ind[(int)ind.size() - 2];
		for (auto it : G[v]) {
			if (it.first == p) continue;
			ind.push_back(it.first);
			len.push_back(it.second);
			break;
		}
	}
	f(ind, len);
	reverse(ind.begin(), ind.end()); reverse(len.begin(), len.end());
	f(ind, len);
	for (int i = 1; i <= n; i++) {
		cout << cnt[i] << "\n";
	}
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...