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. ios的单元測试OCUnit以及更新了之后的XCTestCase

    1.像一般创建项目的步骤一样.创建一个用于測试的项目或者打开一个待測试的项目. (oc是5.0之前所使用的測试,如今用的是XCtestCase,默认会创建一个主的測试类.曾经版本号可能非常多步骤省去) ...

  2. [转]spring 官方下载地址(Spring Framework 3.2.x&Spring Framework 4.0.x)

    SPRING官方网站改版后,建议都是通过 Maven和Gradle下载,对不使用Maven和Gradle开发项目的,下载就非常麻烦,下给出Spring Framework jar官方直接下载路径: h ...

  3. mysql中concat 和 group_concat()的用法

    一.CONCAT()函数CONCAT()函数用于将多个字符串连接成一个字符串.使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为+----+ ...

  4. sql 替换字符串

    MSSQL替换语句: )),'abc.com','123.com') 例如: update PE_Article set Content=replace(cast(Content as varchar ...

  5. 运行RF测试案例,显示unable to open socket to "localhost:56505" error: [Errno 10061] 错误,且关闭RF卡死的解决办法

    问题描述: 执行WEB ui测试案例后,执行请他的测试案例显示unable to open socket to "localhost:56505" error: [Errno 10 ...

  6. bat批处理文件按顺序执行exe

    start /d "deepstream.io-windows-3.1.0" deepstream.exe rem 等待1秒钟 choice /t 1 /d y /n cd &qu ...

  7. CentOS7--配置时间和日期

    CentOS7提供三个命令行工具,可用于配置和显示有关系统日期和时间的信息. timedatectl:Linux 7中的新增功能,也是systemd其中的一部分. date:系统时钟,也成为软件时钟, ...

  8. ASP.NET MVC入门到精通——数据库仓储

    业务层调用数据层对象,我不想每次都new一个数据层对象,而是在数据层创建一个仓储,统一管理所有的对象调用. 1.在IDAL项目中,新建IDBSession.tt模板   Ctrl+S后自动生成IDBS ...

  9. map 集合的遍历

    List<Map<String,Object>> autoReplyList= wechatService.queryAutoReplyByOrg(orgId); for(Ma ...

  10. Pycharm按装

    1.python 官方 2.下载完成后点击exe 安装 3.按装完成后在cmd中输入 python 1.如果显示python版本 那么就安装成功 2.如果出现"python"不是外 ...