比赛 2026.4.11 评测结果 ATTEEEEEEEW
题目名称 rldcot 最终得分 9
用户昵称 xuyuqing 运行时间 2.871 s
代码语言 C++ 内存使用 3.73 MiB
提交时间 2026-04-11 10:14:27
显示代码纯文本

#include <algorithm>
#include <cstdio>
#include <iostream>
#include <unordered_set>
#include <utility> 
#include <vector>

using namespace std;

const int N = 5145;
const int Log = 20;

int n;
int m;
vector<pair<int, long long> > tree[N];
int dep[N];
int fa[Log][N];
long long d[N];

void dfs (int now, int dad) {
    for (auto pa : tree[now]) {
        int son = pa.first;
        long long dis = pa.second;
        if (dad == son) {
            continue;
        }
        
        dep[son] = dep[now] + 1;
        fa[0][son] = now;
        for (int i = 1; i < Log; i++) {
            fa[i][son] = fa[i - 1][fa[i - 1][son]];
        }
        d[son] = d[now] + dis;
        dfs (son, now);
    }
}

int lca (int u, int v) {
    if (dep[u] < dep[v]) {
        swap (u, v);
    }
    
    for (int i = Log - 1; i >= 0; i--) {
        if (dep[fa[i][u]] >= dep[v]) {
            u = fa[i][u];
        }
    }
    
    if (u == v) {
        return u;
    }
    
    for (int i = Log - 1; i >= 0; i--) {
        if (fa[i][u] != fa[i][v]) {
            u = fa[i][u];
            v = fa[i][v];
        }
    }
    
    return fa[0][u];
}

int main () {
    
    freopen ("rldcot.in", "r", stdin);
    freopen ("rldcot.out", "w", stdout);
    
    cin >> n >> m;
    for (int i = 1; i < n; i++) {
        int u, v, w;
        cin >> u >> v >> w;
        tree[u].emplace_back(v, w);
        tree[v].emplace_back(u, w);
    }
    
    dfs (1, 0);
    
    for (int i = 1; i <= m; i++) {
        int l, r;
        cin >> l >> r;
        unordered_set<int> s;
        for (int j = l; j <= r; j++) {
            for (int k = j; k <= r; k++) {
//                cout << j << ' ' << k << endl;
//                cout << d[lca (j, k)] << endl; 
                s.insert(d[lca (j, k)]);
            }
        }
        cout << s.size() << endl;
    }
    
    return 0;
}