题意很明显是LCA,dis[a]+dis[b]-2*dis[LCA(a, b)]。第一次写RMQ,写起来也是蛮简单的。学会了在线LCA,哈哈哈哈
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#define N 40010
using namespace std;
vector<pair<int, int> > adj[N];
int dis[N], vi[N<<1], deep[N<<1], first[N];
int num;
void dfs(int x, int f, int dee){
deep[ num ] = dee;
first[ x ] = num;
vi[num ++ ] = x;
for(int i=0; i<adj[x].size(); ++i) {
int next = adj[x][i].first;
int d = adj[x][i].second;
if( next == f)
continue;
dis[ next ] = dis[x] + d;
dfs(next, x, dee+1);
deep[num] = dee;
vi[ num++ ] = x;
}
return ;
}
int R[N<<1][50];
void RMQ(int len){
int K = (int)(log(len) / log(2));
for(int i=0; i<len; ++i) R[i][0] = i;
for(int j=1; j<=K+1; ++j) {
for(int i=0; i+(1<<j)<=len; ++i) {
if(deep[ R[i][j-1] ] < deep[ R[i+(1<<(j-1))][j-1] ])
R[i][j] = R[i][j-1];
else
R[i][j] = R[i+(1<<(j-1))][j-1];
}
}
}
int query(int a, int b) {
if(a > b){
swap(a, b);
}
int K = log(b-a+1) / log(2);
return (deep[ R[a][K] ] < deep[ R[b-(1<<K)+1][K] ] ? R[a][K] : R[b-(1<<K)+1][K]);
}
int main(int argc, char* argv[]){
int t;
scanf("%d", &t);
while(t--) {
int n, m;
scanf("%d%d", &n, &m);
for(int i=0; i<=n; ++i) {
adj[i].clear();
}
for(int i=0; i<n-1; ++i) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
adj[a].push_back( make_pair(b, c) );
adj[b].push_back( make_pair(a, c) );
}
num = 0;
dis[1] = 0;
dfs(1, 1, 0);
RMQ(num);
while(m--) {
int a, b;
scanf("%d%d", &a, &b);
printf("%d\n", dis[a]+dis[b]-2*dis[ vi[ query(first[a], first[b]) ]]);
}
}
return 0;
}