HDU5266---pog loves szh III (线段树+LCA)
题意: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)的更多相关文章
- 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 ...
- HDU 5266 pog loves szh III (线段树+在线LCA转RMQ)
题目地址:HDU 5266 这题用转RMQ求LCA的方法来做的很easy,仅仅须要找到l-r区间内的dfs序最大的和最小的就能够.那么用线段树或者RMQ维护一下区间最值就能够了.然后就是找dfs序最大 ...
- HDU 5266 pog loves szh III(区间LCA)
题目链接 pog loves szh III 题意就是 求一个区间所有点的$LCA$. 我们把$1$到$n$的$DFS$序全部求出来……然后设$i$的$DFS$序为$c[i]$,$pc[i]$为$c ...
- 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 ...
- hdu 5266 pog loves szh III(lca + 线段树)
I - pog loves szh III Time Limit:6000MS Memory Limit:131072KB 64bit IO Format:%I64d & %I ...
- 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 ...
- HDU 5266 pog loves szh III
题意:给出一棵树,1为根节点,求一段区间内所有点的最近公共祖先. 解法:用一棵线段树维护区间LCA.LCA是dp做法.dp[i][j]表示点i的第2^j个祖先是谁,转移方程为dp[i][j] = dp ...
- HDU 5266 pog loves szh III (LCA)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5266 题目就是让你求LCA,模版题.注意dfs会栈溢出,所以要扩栈,或者用bfs写. #pragma ...
- 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 ...
- 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 ...
随机推荐
- SpringMVC02静态资源的访问
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...
- 安装VS2013的离线MSDN帮助文档
作为vs的初学者,安装帮助文档有利于快速掌握.net的基本语法,对于摸索学习的同学帮助很大. VS2013和VS2012的帮助文档目前为止还是一样 下面是下载地址 http://www.micr ...
- Eclipse利用代理快速安装插件
在eclipse启动时增加以下参数: eclipse.exe -vmargs -DproxySet=true -DproxyHost=aProxyAddress -DproxyPort=aProxyP ...
- xampp进程和非进程执行
xampp以服务和非服务运行apache有哪些区别?为什么去掉勾是以进程的形式执行?
- 在java代码中显示json字符串(怎么避免json字符串中双引号在java代码中显示)
String log = "eyJvcmRlckluZm8iOnsiaWQiOjEwNzQwNCwib3JkZXJJZCI6MjczNjQyMSwicHJvZHVjdENvZGUiOjQ1N ...
- LINQ简明教程:数据排序、分组、过滤
LINQ可以对很多数据源进行查询操作,比如数据库.数组(array).链表(list).XML文件等.在本文中,我将从数组中提取数据,这些数据是10个最受欢迎的国家.有一个类叫Countries,有c ...
- Entity Framework 的事务
一个db.SaveChanges()相当于一个事务,多个db.SaveChanges()保证操作完整性则需要使用事务 在Entity Framework 中使用事务,事务只会对数据库操作进行回滚,不会 ...
- iOS-封装静态库
最近在做Apple的IOS开发,有开发静态库的需求,本身IOS的开发,只允许静态库或者Framework.在Xcode上没有找到允许编译,如同Android上的*.so和Win32上的dll这样的说法 ...
- Android Support V7 包中 ActionBar的使用
以下示例为API<11,因为API>=11时本来就有ActionBar可以使用,所以不猜讨论范围之内 今天Google发布了最新的API 18,包括众多新的性能,正好最近在研究Action ...
- php经典面试题
1. 用PHP打印出前一天的时间,打印格式是2007年5月10日 22:21:21 2. PHP代码如下:$a="hello"; $b=&$a;unset($b);$b=& ...