Pog and Szh are playing games. Firstly Pog draw a tree on the paper. Here we define 1 as the root of the tree.Then Szh choose some nodes from the tree. He wants Pog helps to find the least common ancestor (LCA) of these node.The question is too difficult for Pog.So he decided to simplify the problems.The nodes picked are consecutive numbers from lili to riri ([li,ri])([li,ri]). 

Hint : You should be careful about stack overflow !

InputSeveral groups of data (no more than 3 groups,n≥10000n≥10000 or Q≥10000Q≥10000). 

The following line contains ans integers,n(2≤n≤300000)n(2≤n≤300000). 

AT The following n−1n−1 line, two integers are bibi and cici at every line, it shows an edge connecting bibi and cici. 

The following line contains ans integers,Q(Q≤300000)Q(Q≤300000). 

AT The following QQ line contains two integers li and ri(1≤li≤ri≤n1≤li≤ri≤n).OutputFor each case,output QQ integers means the LCA of [li,ri][li,ri].Sample Input

5
1 2
1 3
3 4
4 5
5
1 2
2 3
3 4
3 5
1 5

Sample Output

1
1
3
3
1

Hint

Be careful about stack overflow.
        

用BFS 预处理不会爆栈  注意看n的范围 看到前面的1e5就以为是1e5了

f[i][j]表示节点i的第2^j个祖先

#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <cstring>
#include <vector>
#include <map>
#include <set>
#include <stdio.h>
#include <queue>
#include <stack>
#define inf 0x3f3f3f3f
using namespace std; int n, q, ecnt;
const int maxn = 300005;
struct edge{
int v, next;
}e[maxn << 1];
int dep[maxn], f[20][maxn], head[maxn]; void bfs(int rt)
{
queue<int> q;
q.push(rt);
f[0][rt] = rt;
dep[rt] = 0;
while(!q.empty()){
int tmp = q.front();
q.pop();
for(int i = 1; i < 20; i++){
f[i][tmp] = f[i - 1][f[i - 1][tmp]];
}
for(int i = head[tmp]; i != -1; i = e[i].next){
int v = e[i].v;
if(v == f[0][tmp]) continue;
dep[v] = dep[tmp] + 1;
f[0][v] = tmp;
q.push(v);
}
}
} int LCA(int u, int v)
{
if(dep[u] > dep[v]) swap(u, v);
int hu = dep[u], hv = dep[v];
int tu = u, tv = v;
for(int det = hv - hu, i = 0; det; det >>= 1, i++){
if(det & 1){
tv = f[i][tv];
}
}
if(tu == tv){
return tu;
}
for(int i = 19; i >= 0; i--){
if(f[i][tu] == f[i][tv]){
continue;
}
tu = f[i][tu];
tv = f[i][tv];
}
return f[0][tu]; } void init()
{
memset(head, -1, sizeof(head));
ecnt = 0;
} void adde(int u, int v)
{
e[ecnt].v = v;
e[ecnt].next = head[u];
head[u] = ecnt++;
} int dp[maxn][20];
int main()
{
while(scanf("%d", &n) != EOF){
init();
for(int i = 1; i < n; i++){
int x, y;
scanf("%d%d", &x, &y);
adde(x, y);
adde(y, x);
}
bfs(1);
for(int i = 1; i <= n; i++){
dp[i][0] = i;
}
for(int j = 1; j < 20; j++){
for(int i = 1; i + (1 << j) - 1 <= n; i++){
dp[i][j] = LCA(dp[i][j - 1], dp[i + (1 << (j - 1))][j - 1]);
}
} scanf("%d", &q);
while(q--){
int l, r;
scanf("%d%d", &l, &r);
int k = (int)log2(r - l + 1);
cout<<LCA(dp[l][k], dp[r - (1 << k) + 1][k])<<endl;
}
}
return 0;
}

hdu5266 pog loves szh III 【LCA】【倍增】的更多相关文章

  1. 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 ...

  2. HDU 5266 pog loves szh III (LCA)

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

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

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

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

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

  5. 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 ...

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

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

  7. HDU 5266 pog loves szh III

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

  8. 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 ...

  9. 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. oop思维意识,类 模块命名空间,类扩展之继承 、组合、mixin三种模式

    python的书都是讲怎么创建类怎么实例化对象,一般会用使用了,但还不具备这种编程意识.这是从python学习手册第四版节选出来的,书中说oop不仅是一种技术,更是一种经验.学习大神的看法,为什么需要 ...

  2. Aspose------导入Excel

    代码: public List<T> ImportExcelToList<T>() { HttpContext context = HttpContext.Current; ) ...

  3. Java -- 获取MAC地址

    啦啦啦 package com.xindatai.common.util; import java.io.InputStream; import java.util.regex.Matcher; im ...

  4. MySQL使用DDL语句创建表

    一.使用DDL语句创建表 DDL语言全面数据定义语言(Data Define Language) 主要的DDL动词: CREATE(创建).DROP(删除).ALTER(修改) TRUNCATE(截断 ...

  5. 【RF库XML测试】Add Element

    Name:Add ElementSource:XML <test library>Arguments:[ source | element | index=None | xpath=. ] ...

  6. mybayis 之resultType="map"

    List<Map> publishInfos = memberShareMapper.shareToCouponCountGroupByPublishId(memberShare.getA ...

  7. N76E003系统时钟

    系统时钟源N76E003共有3种系统时钟源,包括: 内部高速/低速振荡器.外部输入时钟.它们每一个都可以作为N76E003的系统时钟源.开启不同的时钟源可能会影响到多功能引脚P3.0/XIN .内部振 ...

  8. 《转》python学习(12)-列表解析

    转自 http://www.cnblogs.com/BeginMan/p/3164937.html 一.列表解析 列表解析来自函数式编程语言(haskell),语法如下: [expr for iter ...

  9. WP8.1学习系列(第九章)——透视Pivot开发指南

    Windows Phone 8 的 Pivot 控件 2014/6/18 适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1 | Windows P ...

  10. QT开发之旅二TCP调试工具

    TCP调试工具顾名思义用来调试TCP通信的,网上这样的工具N多,之前用.NET写过一个,无奈在XP下还要安装个.NET框架才能运行,索性这次用QT重写,发现QT写TCP通信比.NET还要便捷一些,运行 ...