题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266

解题思路:

考虑dfs序,通过在简单的证明可知L~R的LCA为L ~R 中dfs序较小的那个位置与dfs序较大的那个位置的LCA。因此只要通过st表处理L~R最大dfs序与最小dfs序的编号即可。 这里用线段树维护dfs序的最大和最小值。

#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;const int maxn = 300005;
const int inf = 0x3f3f3f3f;
struct Edge
{int to,next;
}edge[maxn<<1];
struct Seg
{int l,r,Min,Max;
}tree[maxn<<2];
int n,q,cnt,tot,head[maxn];
int ver[maxn],R[maxn],first[maxn];
int dp[maxn<<1][20],minl,maxr;void addedge(int u,int v)
{edge[cnt].to = v;edge[cnt].next = head[u];head[u] = cnt++;
}void initRMQ()
{for(int i = 1; i <= tot; i++)dp[i][0] = i;for(int j = 1; (1 << j) <= tot; j++)for(int i = 1; i + (1 << j) - 1 <= tot; i++){if(R[dp[i][j-1]] < R[dp[i+(1<<j-1)][j-1]])dp[i][j] = dp[i][j-1];else dp[i][j] = dp[i+(1<<j-1)][j-1];}
}int findLCA(int l,int r)
{int k = (int)(log(r - l + 1.0) / log(2.0));if(R[dp[l][k]] < R[dp[r-(1<<k)+1][k]])return ver[dp[l][k]];return ver[dp[r-(1<<k)+1][k]];
}void build(int rt,int l,int r)
{tree[rt].l = l, tree[rt].r = r;if(l == r){tree[rt].Max = tree[rt].Min = first[l];return;}int mid = (l + r) >> 1;build(rt<<1,l,mid);build(rt<<1|1,mid+1,r);tree[rt].Max = max(tree[rt<<1].Max,tree[rt<<1|1].Max);tree[rt].Min = min(tree[rt<<1].Min,tree[rt<<1|1].Min);
}void query(int rt,int l,int r)
{if(l <= tree[rt].l && tree[rt].r <= r){minl = min(minl,tree[rt].Min);maxr = max(maxr,tree[rt].Max);return;}int mid = (tree[rt].l + tree[rt].r) >> 1;if(l <= mid) query(rt<<1,l,r);if(mid < r) query(rt<<1|1,l,r);
}void dfs(int u,int fa,int depth)
{first[u] = ++tot;R[tot] = depth;ver[tot] = u;for(int i = head[u]; i != -1; i = edge[i].next){int v = edge[i].to;if(v == fa) continue;dfs(v,u,depth+1);ver[++tot] = u;R[tot] = depth;}
}int main()
{int u,v,l,r;while(scanf("%d",&n)!=EOF){cnt = tot = 0;memset(head,-1,sizeof(head));for(int i = 1; i < n; i++){scanf("%d%d",&u,&v);addedge(u,v);addedge(v,u);}dfs(1,-1,0);build(1,1,n);initRMQ();scanf("%d",&q);while(q--){scanf("%d%d",&l,&r);maxr = -1,minl = inf;query(1,l,r);int lca = findLCA(minl,maxr);printf("%d\n",lca);}}return 0;
}

hdu 5266(线段树+LCA)相关推荐

  1. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

  2. [BZOJ4372][烁烁的游戏][动态树分治+线段树+LCA]

    [BZOJ4372][烁烁的游戏][动态树分治+线段树+LCA] 题目大意: 给定一颗nn个节点的树,边权均为11,初始每个点权值为00 . 其中操作QQ xx询问x点的点权,操作 MM xx dd ...

  3. HDU - 6393 Traffic Network in Numazu(线段树+LCA+树链剖分+并查集)

    题目链接:点击查看 题目大意:给出一个由n个点和n条边组成的图,每条边都有权值,题目保证图是连通的,然后给出m个询问,每次询问分为两种形式: 0 x y:将第x条边的权值修改为y 1 x y:查询x- ...

  4. hdu 5367(线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5367 官方题解: 对于求"高山脉"长度,可以利用线段树.树节点中保存左高度连续长度 ...

  5. hdu 5124(线段树区间更新+lazy思想)

    http://acm.hdu.edu.cn/showproblem.php?pid=5124 题意:区间覆盖次数问题. 解题思路:线段树水之. #include<iostream> #in ...

  6. HDU - 4578Transformation——线段树+区间加法修改+区间乘法修改+区间置数+区间和查询+区间平方和查询+区间立方和查询

    [题目描述] HDU - 4578Transformation Problem Description Yuanfang is puzzled with the question below: The ...

  7. poj 2777 AND hdu 5316 线段树

    区间染色问题,用线段树可以解决.颜色总类不多,故考虑用二进制数的每一位表示一种颜色,然后父节点的颜色就是孩子节点颜色"或"起来,加上lazy标记,轻松AC. poj 2777: 1 ...

  8. jzoj 5850.【NOIP提高组模拟2018.8.25】e 可持久化线段树+lca

    Description Input Output Data Constraint 分析: 最小连通块可以看作是所有点到他们的 lca l c a lca路径的并集,因为是取最小值,所以重复的不会有贡献 ...

  9. HDU 5238 线段树+数论

    原题:http://acm.hdu.edu.cn/showproblem.php?pid=5238. 题解:给你长度为n的操作序列,和m组操作求每组操作的模29393的值.这道题直接显然是没有前途的, ...

最新文章

  1. 斯人若彩虹,遇上方知有
  2. MySQL配置文件my.cnf中文版
  3. 修改MySQL字符集
  4. maven2中snapshot快照库和release发布库的应用
  5. python webui测试ie浏览器环境配置_python+selenium做ui自动化测试用法必会
  6. 通信线路工程验收规范 gb51171-2016_老杨一建通信学堂通信线路工程施工技术
  7. 第六届省赛(软件类)真题----Java大学C组答案及解析
  8. Oracle体系结构一
  9. 信息孤岛影响_企业专访:以“信息化”冲破信息孤岛
  10. mathml解析引擎MathPlayer的缺陷
  11. excel表格分割线一分为二_高效秘技!用EXCEL制作导航页和日志表管理日常工作...
  12. orc识别较慢_OCR 中文识别用哪种软件识别率比较高?
  13. vue-quill-editor 富文本 自定义图片上传操作
  14. 【基础理论】介绍一个概率分布:柯西分布
  15. buu-[ACTF新生赛2020]SoulLike
  16. Canvas + WebGL中文艺术字渲染
  17. 机械硬盘——电子计算时代的机电遗风
  18. 霓虹灯效果 函数 作用域
  19. Lua调用C(二) ----ffi方式
  20. python笔记(八)

热门文章

  1. uat环境是什么环境_环境污染会对环境造成怎样的损害?污水处理活性炭能起到什么效果呢?...
  2. 神策数据杨宁:财富管理转型趋势下的精细化运营
  3. 周五话运营 | 和用户谈一段不分手的恋爱(留存分析)
  4. spring mvc-使用Servlet原生API作为参数
  5. 8位以上 密码 正则表达式
  6. 4款语音播报来电短信应用[Android]
  7. java,php,asp,asp.net,ror等几种Web技术对比(第一版本)
  8. 既可输入又可选择的组件
  9. research in attraction
  10. 在参加比赛之后一定要注意的事情