Submission #860351

#TimeUsernameProblemLanguageResultExecution timeMemory
860351serifefedartarJanjetina (COCI21_janjetina)C++17
110 / 110
291 ms16020 KiB
#include <bits/stdc++.h>
using namespace std;
 
#define fast ios::sync_with_stdio(0);cin.tie(0);
#define s second
#define f first
typedef long long ll;
const ll MOD = 1e9 + 7;
const ll LOGN = 18; 
const ll MAXN = 1e5 + 100;

vector<vector<pair<int,int>>> graph;
int marked[MAXN], sz[MAXN], fen[MAXN], k;
ll ans = 0;
ll get(int k) {
	k++;
	if (k <= 0)
		return 0;
	ll res = 0;
	while (k) {
		res += fen[k];
		k -= k & -k;
	}
	return res;
}

void update(int k, int v) {
	k++;
	while (k < MAXN) {
		fen[k] += v;
		k += k & -k;
	}
}

int get_sz(int node, int parent) {
	sz[node] = 1;
	for (auto u : graph[node]) {
		if (u.f == parent || marked[u.f])
			continue;
		sz[node] += get_sz(u.f, node);
	}
	return sz[node];
}

int find_centro(int node, int parent, int n) {
	for (auto u : graph[node]) {
		if (u.f != parent && !marked[u.f] && sz[u.f] * 2 >= n)
			return find_centro(u.f, node, n);
	}
	return node;
}

vector<pair<int,int>> v;
void dfs(int node, int parent, int mx, int len) {
	v.push_back({mx, len});
	for (auto u : graph[node]) {
		if (u.f != parent && !marked[u.f])
			dfs(u.f, node, max(mx, u.s), len+1);
	}
}

ll calc(int node, int parent, int mx, int len) {
	v.clear();
	dfs(node, parent, mx, len);
	sort(v.begin(), v.end());

	ll ret = 0;
	for (auto u : v) {
		int val = u.f - u.s;
		ret += get(val - k);
		update(u.s, 1);
	}
	for (auto u : v)
		update(u.s, -1); 
	return ret;
}

void decompose(int node, int parent) {
	int n = get_sz(node, parent);
	int centro = find_centro(node, parent, n);

	ans += calc(centro, centro, 0, 0);
	marked[centro] = 1;
	for (auto u : graph[centro]) {
		if (!marked[u.f])
			ans -= calc(u.f, u.f, u.s, 1);
	}

	for (auto u : graph[centro]) {
		if (!marked[u.f])
			decompose(u.f, node);
	}
}

int main() {
	fast
	int n, x, y, w;
	cin >> n >> k;

	graph = vector<vector<pair<int,int>>>(n+1, vector<pair<int,int>>());
	for (int i = 1; i < n; i++) {
		cin >> x >> y >> w;
		graph[x].push_back({y, w});
		graph[y].push_back({x, w});
	}
	decompose(1, 1);
	cout << ans*2 << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...