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 ...
随机推荐
- 对openflow 1.0协议的扩展
通过这几天对openvswitch代码的分析,以及项目的须要,须要对openflow 1.0进行一定的扩展,发现网上没有这方面的教程,尽管在搞懂ovs代码架构,floodlight controlle ...
- 理解 B*tree index内部结构
转载请注明出处:http://write.blog.csdn.net/postedit/40589651 Oracle数据库里的B树索引就好象一棵倒长的树.它包括两种类型的数据块:一种是索引分支块,还 ...
- Android实现真正的ViewPager【平滑过渡】+【循环滚动】!!!顺带还有【末页跳转】。
实现真正的ViewPager[平滑过渡]+[循环滚动]!!!顺带还有[末页跳转]. 首先呢, 我要对网上常见的3种ViewPager的循环滚动方法做个概述.急需看真正实现方法的同志请选择性忽略下面这一 ...
- 批量升级BMC固件asu64、ipmitool
需求:通过服务器远程管理IP批量升级IMM.UEFI固件 工具:asu64.ipmitool.iflash64.cdc_interface.sh 下载:http://pan.baidu.com/s/1 ...
- 在top命令下kill和renice进程
For common process management tasks, top is so great because it gives an overview of the most active ...
- Linux命令行文本处理工具
关键字搜索: grep 关键字 指定文件 -i 搜索时忽略大小写 -n 显示结果所在行 -v 显示不包含关键字的行 基于列的文本处理: cut -d: -f1 /etc/passwd -d ...
- JAVA为什么会空指针异常
1.所谓的指针,就是java中的对象的引用.比如String s;这个s就是指针. 2.所谓的空指针,就是指针的内容为空,比如上面的s,如果令它指向null,就是空指针. 3.所谓的空指针异常,就是一 ...
- Linux升级C基本运行库CLIBC
在你准备升级GLIBC库之前,你要好好思考一下, 你真的要升级GLIBC么? 你知道你自己在做什么么? glibc是gnu发布的libc库,即c运行库.glibc是linux系统中最底层的api,几乎 ...
- mysql的perror
eg: 执行:perror 1064 返回:MySQL error code 1064 (ER_PARSE_ERROR): %s near '%-.80s' at line %d ...
- XIB自定义视图的整理
- (void)setAppInfo:(AppInfo *)appInfo { _appInfo = appInfo; _icon.image = appInfo.image; _label.text ...