QTREE - Query on a tree
QTREE - Query on a tree
题目链接:http://www.spoj.com/problems/QTREE/
参考博客:http://blog.sina.com.cn/s/blog_7a1746820100wp67.html
树链剖分入门题
代码如下(附注解):
#include <cstdio>
#include <cstring>
#include <iostream>
#define lson (x<<1)
#define rson ((x<<1)|1)
#define mid ((l+r)>>1)
#define N 10010
using namespace std;
struct Edge{
int to,next;
}e[N<<];
int T,n,tot,oo,root;
],tree[N<<];//头结点,inpotData,线段树
int fa[N],siz[N],dep[N],son[N];//父亲,包含该节点的子树的结点数,深度,重链上的儿子
int top[N],p[N];//当前节点所在重链的顶端结点,当前节点与其父亲的连边在线段树中的位置
];
void addEdge(int u,int v){//用头接法链表存当前节点的各个儿子
e[++oo].to=v;
e[oo].next=head[u];
head[u]=oo;
}
void fristDFS(int v){//第一次dfs求siz,son,dep,fa
siz[v]=,son[v]=;
;i=e[i].next){
int u=e[i].to;
if(u!=fa[v]){
fa[u]=v;
dep[u]=dep[v]+;
fristDFS(u);
if(siz[u]>siz[son[v]])son[v]=u;
siz[v]+=siz[u];
}
}
}
void secondDFS(int v,int tp){//第二次dfs求top,p
p[v]=++tot,top[v]=tp;
)secondDFS(son[v],top[v]);
;i=e[i].next){
int u=e[i].to;
if(u!=fa[v]&&u!=son[v])secondDFS(u,u);
}
}
void push_up(int x){
tree[x]=max(tree[lson],tree[rson]);
}
void updata(int x,int l,int r,int p,int v){//建线段树
if(l==r){
tree[x]=v;
return;
}
if(p<=mid)updata(lson,l,mid,p,v);
,r,p,v);
push_up(x);
}
void init(){
memset(siz,,sizeof(siz));
memset(head,,sizeof(head));
scanf("%d",&n);
root=(n+)/;//任意取一个root
oo=tot=fa[root]=dep[root]=;
;i<n;++i){
;j<;++j)scanf("%d",&a[i][j]);
addEdge(a[i][],a[i][]);
addEdge(a[i][],a[i][]);
}
fristDFS(root);
secondDFS(root,root);
;i<n;++i){
]]>dep[a[i][]])swap(a[i][],a[i][]);
//将远离root的结点放在d[i][1]
updata(,,tot,p[a[i][]],a[i][]);
}
}
int query(int x,int l,int r,int a,int b){
if(a<=l&&r<=b)return tree[x];
;
if(a<=mid)tmp=max(tmp,query(lson,l,mid,a,b));
,r,a,b));
return tmp;
}
int find(int x,int y){
;
while(f1!=f2){//若x,y不在同一条重链上
if(dep[f1]<dep[f2])swap(f1,f2),swap(x,y);
//取深度大的点,f1为该重边的顶端结点,va为该结点
//在线段树中[f1,va]一定为一个连续的区间
tmp=max(tmp,query(,,tot,p[f1],p[x]));
x=fa[f1];f1=top[x];
}
if(x==y)return tmp;
if(dep[y]<dep[x])swap(x,y);
,,tot,p[son[x]],p[y]));//不包含x与其父亲构成的边
}
void solve(){
int x,y;
]!='D';scanf("%s",s)){
scanf("%d%d",&x,&y);
]=='Q')printf("%d\n",find(x,y));
]==,,tot,p[a[x][]],y);
}
}
int main(void){
for(scanf("%d",&T);T;T--){
init();
solve();
}
}
QTREE - Query on a tree的更多相关文章
- SPOJ QTREE Query on a tree 树链剖分+线段树
题目链接:http://www.spoj.com/problems/QTREE/en/ QTREE - Query on a tree #tree You are given a tree (an a ...
- SP375 QTREE - Query on a tree (树剖)
题目 SP375 QTREE - Query on a tree 解析 也就是个蓝题,因为比较长 树剖裸题(基本上),单点修改,链上查询. 顺便来说一下链上操作时如何将边上的操作转化为点上的操作: 可 ...
- SPOJ VJudge QTREE - Query on a tree
Query on a tree Time Limit: 851MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu Submi ...
- spoj QTREE - Query on a tree(树链剖分+线段树单点更新,区间查询)
传送门:Problem QTREE https://www.cnblogs.com/violet-acmer/p/9711441.html 题解: 树链剖分的模板题,看代码比看文字解析理解来的快~~~ ...
- SPOJ QTREE Query on a tree --树链剖分
题意:给一棵树,每次更新某条边或者查询u->v路径上的边权最大值. 解法:做过上一题,这题就没太大问题了,以终点的标号作为边的标号,因为dfs只能给点分配位置,而一棵树每条树边的终点只有一个. ...
- SPOJ375 QTREE - Query on a tree
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- SP375 QTREE - Query on a tree
题意大意 给定\(n\)个点的树,边按输入顺序编号为\(1,2,...n-1\),要求作以下操作: CHANGE \(i\) \(t_i\) 将第\(i\)条边权值改为\(t_i\),QUERY \( ...
- SPOJ QTREE Query on a tree VI
You are given a tree (an acyclic undirected connected graph) with n nodes. The tree nodes are number ...
- SPOJ QTREE Query on a tree V
You are given a tree (an acyclic undirected connected graph) with N nodes. The tree nodes are number ...
随机推荐
- 企业架构与建模之使用ArchiMate进行分析
企业架构与建模之使用ArchiMate进行分析(全系列完) 4. 使用ArchiMate进行分析 正如前面所说的那样,一个企业整体效率的提升有时并不是通过某一个领域内的优化就能达到的,而且这种忽视全局 ...
- python(学习之路一)
''' Created on 2013-5-3 @author: lixingle ''' #输出的练习 length=3 width=4; area=length*width print(area) ...
- TOGAF企业连续体和工具之架构资源库及架构工具的选择
TOGAF企业连续体和工具之架构资源库及架构工具的选择 3. 架构资源库 在一个企业,尤其是在一个大型企业中,建设一个成熟的架构往往会产生大量的工作产品.为了很好地管理和利用这些工作产品,企业需要制定 ...
- C语言面试问答(3)
12个滑稽的C语言面试问答——<12个有趣的C语言问答>评析(3) 前文链接:http://www.cnblogs.com/pmer/p/3322429.html 5,atexit wit ...
- 【NET】Winform分页控件初探
public partial class WinFormPager : UserControl { ; /// <summary> /// 当前页 /// </summary> ...
- MFC 数据库编程 增删改查的一个例子
1.先看下效果图: 主界面: 一个最简单的1对多的表,一张Article(文章)表,一张Category(类别)表.有添加,修改,删除文章按钮.点击类别编辑按钮就会跳到第二个对话框.点击数据库配置就会 ...
- A*算法&博弈树α-β剪枝
A*算法&博弈树α-β剪枝 A*算法/博弈树 前阵子考试学了A*算法.博弈树和回溯,自己真是愚蠢至极,根本没就搞明白这些,所以对于这些算法问道的话就不能说清楚,也记不住,所以才有了这篇笔记.在 ...
- cocos2d-x场景切换与过渡效果
场景切换 void MyScene::daySceneCallback(CCObject *pSender) { CCScene *scene = new MyScene(); ...
- 前端:JS获取单击按钮单元格所在行的信息
在操作表格前后端交互式时,总会遇到将所要操作的行的信息传至后台进行数据库更新的操作,本文适用于标准的html页面和js库,并提出了三种操作方式根据实际情况进行选择 1.表格格式如图所示 2.表格代码如 ...
- Android中使用开源框架PagerSlidingTabStrip实现导航标题
此开源框架官网地址:https://github.com/astuetz/PagerSlidingTabStrip 可以理解为配合ViewPager使用的交互式页面指示器控件. 话不多说,先上效果图: ...