| 比赛 |
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;
}