比赛 2026.5.16 评测结果 WTTEEETTTT
题目名称 填树 最终得分 0
用户昵称 LikableP 运行时间 13.256 s
代码语言 C++ 内存使用 3.42 MiB
提交时间 2026-05-16 12:01:22
显示代码纯文本
#include <cstdio>
#include <vector>
#include <algorithm>

int n, K;
int l[10], r[10];
int a[10];
std::vector<int> g[10];
int ans1, ans2;

void chk(int now) {
  int max = -1, min = 1000000001, sum = 0;
  for (int i = 1; i <= now; ++i) {
    max = std::max(max, a[i]);
    min = std::min(min, a[i]);
    sum += a[i];
  }
  if (max - min <= K) {
    ans1 += 1;
    ans2 += sum;
  }
}

void dfs(int now, int fa) {
  for (int i = l[now]; i <= r[now]; ++i) {
    a[now] = i;
    chk(now);
    for (int v : g[now]) if (v != fa && a[v] == 0) {
      dfs(v, now);
    }
    a[now] = 0;
  }
}

int main() {
  freopen("tree.in", "r", stdin);
  freopen("tree.out", "w", stdout);
  scanf("%d %d", &n, &K);
  for (int i = 1; i <= n; ++i) {
    scanf("%d %d", &l[i], &r[i]);
  }
  for (int i = 1, u, v; i <= n - 1; ++i) {
    scanf("%d %d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
  }
  
  for (int i = 1; i <= n; ++i) dfs(i, 0);
  printf("%d\n%d\n", ans1 / 2, ans2 / 2);
  return 0;
}