所以只需要用线段树合并一下就好了

#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#define x first
#define y secondusing namespace std;const int N = 5e5 + 10,M = N * 2;typedef long long ll;
typedef pair<int,int> PII;int head[N],to[M],last[M],w[M],cnt;
void add(int a,int b,int c){to[++cnt] = b;w[cnt] = c;last[cnt] = head[a];head[a] = cnt;
}int depth[N],fa[N][22],dis[N];
void dfs(int x,int lastt){fa[x][0] = lastt;for(int i = head[x]; i != -1; i = last[i]){int j = to[i];if(j == lastt) continue;depth[j] = depth[x] + 1;dis[j] = dis[x] + w[i];dfs(j,x);}
}int lca(int x,int y){if(depth[x] > depth[y]) swap(x,y);//depth[x] < depth[y]int cha = depth[y] - depth[x];for(int i = 20; i >= 0; i--){if((1 << i) <= cha) cha -= 1 << i,y = fa[y][i];}if(x == y) return x;for(int i = 20; i >= 0; i--){int dx = fa[x][i],dy = fa[y][i];if(dx != dy) x = dx,y = dy;}return fa[x][0];
}bool cmp(int a,int b){return depth[a] > depth[b];
}PII unite(PII a,PII b){int LCA[5];LCA[1] = lca(a.x,b.x);LCA[2] = lca(a.x,b.y);LCA[3] = lca(a.y,b.x);LCA[4] = lca(a.y,b.y);sort(LCA + 1,LCA + 5,cmp);return {LCA[1],LCA[2]};
}PII P[N * 4];
void build(int s,int t,int p){if(s == t){scanf("%d%d",&P[p].x,&P[p].y);return;}int mid = s + t >> 1;build(s,mid,p * 2);build(mid + 1,t,p * 2 + 1);P[p] = unite(P[p * 2],P[p * 2 + 1]);
}PII query(int s,int t,int p,int l,int r){if(s >= l && t <= r){return P[p];}int mid = s + t >> 1;PII G = {0,0};if(l <= mid) G = query(s,mid,p * 2,l,r);if(mid < r){if(G == make_pair(0,0)) G = query(mid + 1,t,p * 2 + 1,l,r);else G = unite(G,query(mid + 1,t,p * 2 + 1,l,r));}return G;
}int main(){int n;cin >> n;memset(head,-1,sizeof head);for(int i = 1; i <= n - 1; i++){int x,y,z;scanf("%d%d%d",&x,&y,&z);add(x,y,z);add(y,x,z);}dfs(1,0);for(int i = 1; i <= 21; i++){for(int x = 1; x <= n; x++)fa[x][i] = fa[fa[x][i - 1]][i - 1];}int m;cin >> m;build(1,m,1);int k;cin >> k;while(k--){int x,y;scanf("%d%d",&x,&y);PII G = query(1,m,1,x,y);int t = lca(G.x,G.y);cout << dis[G.x] + dis[G.y] - 2 * dis[t] << endl;}return 0;
}

51nod 1830相关推荐

  1. 51NOD - 1830路径交

    题目链接:51NOD - 1830路径交 因为每次是区间询问,所以我们可以类似ST表预处理,或者线段树区间合并去处理. 每次维护节点就是代表所有路径的交集. 现在问题就是两个路径的交怎么求: 两条路径 ...

  2. 51nod 1617 奇偶数组

    传送门 回来看一眼51nod,发现自己掉到rank4了,赶紧切道题回rank3. 一眼不会做,这种东西应该慢慢找规律吧--然后看到数据范围其实比较小,应该是单次log的,那是不是可以分治啊. #inc ...

  3. 51NOD 1773:A国的贸易——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1773 参考1:FWT讲解 https://www.cnblogs.com ...

  4. 51nod 1040:最大公约数之和(数论)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 给出一个n,求1-n这n个数,同n的最大公约数的和. ...

  5. (DP)51NOD 1183 编辑距离

    编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除 ...

  6. 斜率小于0的连线数量 51Nod - 1107 (树状数组+离散化)

    二维平面上N个点之间共有C(n,2)条连线.求这C(n,2)条线中斜率小于0的线的数量. 二维平面上的一个点,根据对应的X Y坐标可以表示为(X,Y).例如:(2,3) (3,4) (1,5) (4, ...

  7. 51Nod 1003 阶乘后面0的数量(数学,思维题)

    1003 阶乘后面0的数量 基准时间限制:1 秒 空间限制:131072 KB 分值: 5         难度:1级算法题 n的阶乘后面有多少个0? 6的阶乘 = 1*2*3*4*5*6 = 720 ...

  8. 51nod 1270 数组的最大代价

    1270 数组的最大代价 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 数组A包含N个元素A1, A2......AN.数组B包 ...

  9. 51nod 算法马拉松18 B 非010串 矩阵快速幂

    51nod 算法马拉松18 B 非010串 矩阵快速幂 非010串 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 如果一个01字符串满足不存在010这样的子串,那么称它为非010串 ...

最新文章

  1. java虚拟机内存比例,【Java虚拟机】堆内存分配策略总结
  2. 【敏捷开发】从需求文档出发聊敏捷
  3. 汇编浮点指令fld、fstp
  4. nuxt解决首屏加载慢问题_如何解决百度云盘下载速度慢的问题
  5. Vue-cli 2在webpack内使用雪碧图(响应式)
  6. Django:Web框架,WSGI,WSGI实现浏览器与服务器通信,路由route,WSGI实现页面访问
  7. Oracle中各个命中率的总结及调优笔记整理
  8. ES6——rest参数
  9. hdu 3905(dp)
  10. pythonsocket自动化教程_Python基本socket通信控制操作示例
  11. 用户故事与敏捷方法笔记 --- 用户故事
  12. 综合云平台 - OpenShift - 07
  13. 资深Java面试题及答案(汇总)
  14. linux卸载小企鹅输入法,Linux(FC)小企鹅输入法的安装
  15. css Flex布局第一部分(基础)
  16. X11 xcb 交叉编译
  17. Copy ‘XXXX‘ to effectively final temp variable
  18. html浏览器pc端禁止缩放,阻止pc端浏览器缩放js代码
  19. Idea Debug 窗口所有按钮详解
  20. ICPC训练联盟2021寒假冬令营(5)(部分题解):

热门文章

  1. 计算机怎样输入毫米符号,Excel 输入特殊符号的6种方法-excel技巧-电脑技巧收藏家...
  2. 【Unity实用工具】TexturePacker使用教程
  3. unity3d实现简单的打飞碟游戏
  4. freeswitch实战八(动态生成拨号计划)
  5. 迟来的加勒比海盗3 观后
  6. HDU2550 百步穿杨
  7. 设计一个jsp页面,要求在网页上显示当前日期和时间,如果时间在6:00~12:00,输出“上午好”:如果时间在12:00 18:00, 输出“下午好”:
  8. 国产操作系统厂商 中科红旗Linux进入清算程序
  9. 任天堂正式发布 NINTENDO SWITCH OLED,乐得瑞任天堂Switch底座方案
  10. PP模块工艺路线明细BAPI