比赛 2026.4.11 评测结果 ATTTTTTTTTW
题目名称 rldcot 最终得分 9
用户昵称 LikableP 运行时间 8.140 s
代码语言 C++ 内存使用 27.76 MiB
提交时间 2026-04-11 10:26:27
显示代码纯文本
#include <cstdio>
#include <vector>
#include <algorithm>
typedef long long ll;

const int MAXN = 1e5 + 10;

struct EDGE {
  int v, w, next;
} edge[MAXN << 1];

int head[MAXN], edgeNum;
void AddEdge(int u, int v, int w) {
  edge[++edgeNum] = {v, w, head[u]};
  head[u] = edgeNum;
}

int grd[MAXN][17], depth[MAXN];
ll dis[MAXN];
void dfs(int u, int fa) {
  grd[u][0] = fa, depth[u] = depth[fa] + 1;
  for (int i = 1; i <= 16; ++i) {
    grd[u][i] = grd[grd[u][i - 1]][i - 1];
  }
  for (int i = head[u]; i; i = edge[i].next) {
    int v = edge[i].v, w = edge[i].w;
    if (v == fa) continue;
    dis[v] = dis[u] + w;
    dfs(v, u);
  }
}

int LCA(int x, int y) {
  if (depth[x] < depth[y]) x ^= y ^= x ^= y;
  for (int i = 16; i >= 0; --i) {
    if (depth[grd[x][i]] >= depth[y]) {
      x = grd[x][i];
    }
  }
  if (x == y) return x;
  for (int i = 16; i >= 0; --i) {
    if (grd[x][i] != grd[y][i]) {
      x = grd[x][i];
      y = grd[y][i];
    }
  }
  return grd[x][0];
}

int n, m;

int main() {
  freopen("rldcot.in", "r", stdin);
  freopen("rldcot.out", "w", stdout);
  scanf("%d %d", &n, &m);
  for (int i = 1, u, v, w; i <= n - 1; ++i) {
    scanf("%d %d %d", &u, &v, &w);
    AddEdge(u, v, w);
    AddEdge(v, u, w);
  }
  
  dfs(1, 0);
  
  for (int _ = 1, l, r; _ <= m; ++_) {
    scanf("%d %d", &l, &r);
    std::vector<int> set;
    for (int i = l; i <= r; ++i) {
      for (int j = i; j <= r; ++j) {
        set.push_back(dis[LCA(i, j)]);
      }
    }
    std::sort(set.begin(), set.end());
    printf("%lld\n", std::unique(set.begin(), set.end()) - set.begin());
  }
  return 0;
}