题意:N个点的有向树, Q次询问, 每次询问区间[L, R]内所有点的LCA。

大致做法:线段树每个点保存它的孩子的LCA值, 对于每一次询问只需要 在线段树查询即可。

 #include <bits/stdc++.h>
using namespace std;
const int MAXN = 3e5+;
struct Edge{
int to, next;
}e[MAXN << ];
int head[MAXN], tot_edge;
void Add_Edge (int x, int y){
e[tot_edge].to = y;
e[tot_edge].next = head[x];
head[x] = tot_edge++;
}
int n, q, MAX_LOG_V;
bool vis[MAXN];
void init (){
MAX_LOG_V = ;
tot_edge = ;
memset(head, -, sizeof (head));
memset(vis, false, sizeof (vis));
}
int dep[MAXN], pa[][MAXN];
void DFS (int r, int pre, int d){ // DFS 或 BFS都可以, G++下BFS
dep[r] = d;
pa[][r] = pre;
for (int i = head[r]; ~i; i = e[i].next){
int u = e[i].to;
if (pre != u){
DFS(u, r, d+);
}
}
}
void BFS (int r, int pre, int d){
dep[r] = d;
pa[][r] = pre;
queue <int>Q;
Q.push(r);
vis[r] = true;
while (!Q.empty()){
int u = Q.front();
Q.pop();
for (int i = head[u]; ~i; i = e[i].next){
int v = e[i].to;
if (!vis[v]){
dep[v] = dep[u] + ;
pa[][v] = u;
Q.push(v);
vis[v] = true;
}
}
}
}
void pre_solve (){
BFS(, -, );
for (int k = ; k + < MAX_LOG_V; k++){
for (int v = ; v <= n; v++){
if (pa[k][v] < ){
pa[k+][v] = -;
}else{
pa[k+][v] = pa[k][pa[k][v]];
}
}
}
}
int LCA (int u, int v){
if (dep[u] > dep[v]){
swap(u, v);
}
for (int k = ; k < MAX_LOG_V; k++){
if ((dep[v] - dep[u]) >> k & ){
v = pa[k][v];
}
}
if (u == v){
return u;
}
for (int k = MAX_LOG_V-; k >= ; k--){
if (pa[k][u] != pa[k][v]){
u = pa[k][u];
v = pa[k][v];
}
}
return pa[][u];
}
int seg[MAXN << ];
void push_up(int pos){
seg[pos] = LCA(seg[pos<<], seg[pos<<|]);
}
void build (int l, int r, int pos){
if (l == r){
seg[pos] = l;
return ;
}
int mid = (l + r) >> ;
build(l, mid, pos<<);
build(mid+, r, pos<<|);
push_up(pos);
}
int query (int l, int r, int pos, int ua, int ub){
if (ua <= l && ub >= r){
return seg[pos];
}
int mid = (l + r) >> ;
int t1 = -, t2 = -;
if (ua <= mid){
t1 = query(l, mid, pos<<, ua, ub);
}
if (ub > mid){
t2 = query(mid+, r, pos<<|, ua, ub);
}
if (t1 == - || t2 == -){
return max(t1, t2);
}else{
return LCA(t1, t2);
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
while (~ scanf ("%d", &n)){
init();
for (int i = ; i < n-; i++){
int u, v;
scanf ("%d%d", &u, &v);
Add_Edge(u, v);
Add_Edge(v, u);
}
pre_solve();
build(, n, );
scanf ("%d", &q);
for (int i = ; i < q; i++){
int ua, ub;
scanf ("%d%d", &ua, &ub);
printf("%d\n", query(, n, , ua, ub));
}
}
return ;
}

HDU5266---pog loves szh III (线段树+LCA)的更多相关文章

  1. HDU 5266 pog loves szh III 线段树,lca

    Pog and Szh are playing games. Firstly Pog draw a tree on the paper. Here we define 1 as the root of ...

  2. HDU 5266 pog loves szh III (线段树+在线LCA转RMQ)

    题目地址:HDU 5266 这题用转RMQ求LCA的方法来做的很easy,仅仅须要找到l-r区间内的dfs序最大的和最小的就能够.那么用线段树或者RMQ维护一下区间最值就能够了.然后就是找dfs序最大 ...

  3. HDU 5266 pog loves szh III(区间LCA)

    题目链接 pog loves szh III 题意就是  求一个区间所有点的$LCA$. 我们把$1$到$n$的$DFS$序全部求出来……然后设$i$的$DFS$序为$c[i]$,$pc[i]$为$c ...

  4. hdu5266 pog loves szh III 【LCA】【倍增】

    Pog and Szh are playing games. Firstly Pog draw a tree on the paper. Here we define 1 as the root of ...

  5. hdu 5266 pog loves szh III(lca + 线段树)

    I - pog loves szh III Time Limit:6000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I ...

  6. HDU 5266 pog loves szh III ( LCA + SegTree||RMQ )

    pog loves szh III Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Oth ...

  7. HDU 5266 pog loves szh III

    题意:给出一棵树,1为根节点,求一段区间内所有点的最近公共祖先. 解法:用一棵线段树维护区间LCA.LCA是dp做法.dp[i][j]表示点i的第2^j个祖先是谁,转移方程为dp[i][j] = dp ...

  8. HDU 5266 pog loves szh III (LCA)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 题目就是让你求LCA,模版题.注意dfs会栈溢出,所以要扩栈,或者用bfs写. #pragma ...

  9. hdu 5265 pog loves szh II

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5265 pog loves szh II Description Pog and Szh are pla ...

  10. hdu 5264 pog loves szh I

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5264 pog loves szh I Description Pog has lots of stri ...

随机推荐

  1. Hadoop32位和64位的查询

    1.查看自己的hadoop版本是32位还是64位 进入: hadoop-2.6.4/lib/native 使用file命令 file libhadoop.so.1.0.0

  2. 95秀-ViewPager 使用实例

    Activity的样式     <style name="under_live_indicator" parent="android:Theme.NoTitleBa ...

  3. Js实现简单的联动,无数据库版本

    <html> <head> <title></title> <script language="javascript" typ ...

  4. sql设置事务隔离级别

    SET TRANSACTION一共有以下几种级别: SET TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPE ...

  5. require(),include(),require_once()和include_once()之间的区别

    引用文件的方法有两种:require 及 include. require 的使用方法如 require("file.php"); .这个函数通常放在 PHP 程序的最前面,PHP ...

  6. MeasureSpec学习

    在自定义View和ViewGroup的时候,我们经常会遇到int型的MeasureSpec来表示一个组件的大小,这个变量里面不仅有组件的尺寸大小,还有大小的模式. 这个大小的模式,有点难以理解.在系统 ...

  7. Jquery中dialog属性小记

    代码如下: $('#dialogDiv').dialog( { hide:true, //点击关闭是隐藏,如果不加这项,关闭弹窗后再点就会出错. autoOpen:false, height:380, ...

  8. JavaScript 显示弹出窗口(二)

    window. open ( sURL , sName , sFeatures , bReplace ) sURL:可选项,被加载页面的html sName:可选项,指定打开的窗口的名字 _media ...

  9. 武汉科技大学ACM:1009: 华科版C语言程序设计教程(第二版)习题5.12

    Problem Description 这天老师照例给小豪出了一道题目:老师给小豪一个字符串,让小豪将该字符串逆序输出. Input 第一行包括一个T,表示有多少组测试数据: 接下来T行,每行包括一个 ...

  10. js中的apply call 操作小结(参考自网络)

    1.方法定义 call方法:  语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象 说明: call ...