hdu 2586(LCA在线ST)】的更多相关文章

How far away ? Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted Submission(s): Problem Description There are n houses in the village and some bidirectional roads connecting them. Every day peole always like…
#include<stdio.h> #include<string.h>//用c/c++会爆栈,用g++ac #define inf 0x3fffffff #define N 41000 struct node { int u,v,w,next; }bian[N*2]; int head[N],yong; int pre[N],dis[N],deep[N]; void addedge(int u,int v,int w) { bian[yong].u=u; bian[yong].v…
题目大意: 多点形成一棵树,树上边有权值,给出一堆询问,求出每个询问中两个点的距离 这里求两个点的距离可以直接理解为求出两个点到根节点的权值之和,再减去2倍的最近公共祖先到根节点的距离 这是自己第一道lca题目 学习了两种方法 第一种在ST算法,利用RMQ思想预处理 /*在线ST算法*/ #pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #include <iostream&…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 在线版本: 在线方法的思路很简单,就是倍增.一遍dfs得到每个节点的父亲,以及每个点的深度.然后用dp得出每个节点向上跳2^k步到达的节点. 那么对于一个查询u,v,不妨设depth[u]>=depth[v],先让u向上跳depth[u]-depth[v]步,跳的方法就是直接用数字的二进制表示跳. 然后现在u和v都在同一深度上了,再二分找向上共同的祖先,就可以二分出lca了.复杂度nlogn预…
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2586 题目大意:在一个无向树上,求一条链权和. 解题思路: 0 | 1 /   \ 2      3 设dist[i]为i到根0的链和,求法(Dfs过程中dist[v]=dist[u]+e[i].w) 对于树中任意两点形成的链,可以通过LCA最近公共祖先剖分. 比如2->3,就可以经过LCA点1:  2->1->3 链和=dist[u]+dist[v]-2*dist[LCA[u,v]] (…
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:n个村庄构成一棵无根树,q次询问,求任意两个村庄之间的最短距离 思路:求出两个村庄的LCA,dis[ i ] 表示结点 i 到树根的距离,那么任意两点u,v的最短距离就是dis[ u ]  - dis [LCA] + dis [ v ] - dis[ LCA ].代码是用tarjan做的,算是模板,记录一下. AC代码: #include<iostream> #include<cst…
Gadget Hackwrench time limit per test 2 seconds memory limit per test 64 megabytes input standard input output standard output Chip 'n' Dale rescue rangers! But observant viewers know that help is usually required by Chip and Dale themselves. Today y…
传送门 (这次的英文题面要比上一个容易看多了) (英语蒟蒻的卑微) 又是一个很裸的LCA题 (显然,这次不太容易打暴力咧) (但听说还是有大佬用dfs直接a掉了) 正好 趁这个机会复习一下LCA 这里用的是倍增lct的思想(一不小心是会写tle的吧) (也有可能是因为我太弱了才t掉的) 我才不会说我有一次卑微了 一开始看PPT 以为自己明白了 结果发现 有一点点问题 由于本题中这个树是题里给的 所以节点的编号不可以简简单单认为是从上到下从左到右顺序排列的 (但其实这部算什么大问题啊qwq) (还…
<题目链接> 题目大意:给你一棵带有边权的树,然后进行q次查询,每次查询输出指定两个节点之间的距离. 解题分析:本题有多重解决方法,首先,可用最短路轻易求解.若只用LCA解决本题,也有三种常用的做法,具体方法如下: LCA转RMQ解法: #include <cstdio> #include <cmath> #include <vector> #include <cstring> #include <algorithm> using n…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2586 LCA模版题. RMQ+LCA: #include <iostream> #include <cstdio> #include <cstring> #include <vector> using namespace std; ; typedef pair<int , int>P; vector <P> G[MAXN]; ] , ok…