Cod sursa(job #3315020)

Utilizator biancalautaruBianca Lautaru biancalautaru Data 11 octombrie 2025 21:30:53
Problema Asmax Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>
#include <cstring>
#include <vector>
#include <climits>
#define DIM 16001
using namespace std;
ifstream fin("asmin.in");
ofstream fout("asmin.out");
int n, k, x, y, mini, cnt, r[DIM], c[DIM];
bool viz[DIM];
vector<int> l[DIM];

void dfs1(int nod, int tata) {
	viz[nod] = true;
	c[1] += (r[nod] - r[tata] + k) % k;
	for (int i = 0; i < l[nod].size(); i++)
		if (!viz[l[nod][i]])
			dfs1(l[nod][i], nod);
}

void dfs2(int nod, int tata) {
	if (nod != 1) {
		c[nod] = c[tata] + r[nod] - r[tata];
		c[nod] -= (r[nod] - r[tata] + k) % k;
		c[nod] += (r[tata] - r[nod] + k) % k;
	}
	viz[nod] = true;
	for (int i = 0; i < l[nod].size(); i++)
		if (!viz[l[nod][i]])
			dfs2(l[nod][i], nod);
}

int main() {
	fin >> n >> k;
	for (int i = 1; i < n; i++) {
		fin >> x >> y;
		l[x].push_back(y);
		l[y].push_back(x);
	}
	for (int i = 1; i <= n; i++)
		fin >> r[i];
	dfs1(1, 0);
	memset(viz, false, sizeof(viz));
	dfs2(1, 0);
	mini = INT_MAX;
	for (int i = 1; i <= n; i++)
		if (c[i] < mini) {
			mini = c[i];
			cnt = 1;
		}
		else
			if (c[i] == mini)
				cnt++;
	fout << mini << " " << cnt << "\n";
	for (int i = 1; i <= n; i++)
		if (c[i] == mini)
			fout << i << " ";
	return 0;
}