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 ...
随机推荐
- Asp.net MVC集成Google Calendar API(附Demo源码)
Asp.net MVC集成Google Calendar API(附Demo源码) Google Calendar是非常方便的日程管理应用,很多人都非常熟悉.Google的应用在国内不稳定,但是在国外 ...
- fastcgi重启
重启nginx和php-cgi 的命令 nginx: sudo /etc/init.d/nginx restart 同样也可以有start,stop等参数php-cgi: 先杀死进程sudo kill ...
- iOS制作Static Library(静态库),实现多工程的连编
在iOS开发中,我们会发现一些偏底层或基础代码是直接可以复用的,当我们换一个项目,改变的只需要是偏上层的业务逻辑代码,所以我们可以把这部分基础代码制作为一个静态库static library,并不断扩 ...
- Linux内核中链表实现
关于双链表实现,一般教科书上定义一个双向链表节点的方法如下: struct list_node{ stuct list_node *pre; stuct list_node *next; ElemTy ...
- JAVA算法两道
算法(JAVA)----两道小小课后题 LZ最近翻了翻JAVA版的数据结构与算法,无聊之下将书中的课后题一一给做了一遍,在此给出书中课后题的答案(非标准答案,是LZ的答案,猿友们可以贡献出自己更快 ...
- C语言面试问答(3)
12个滑稽的C语言面试问答——<12个有趣的C语言问答>评析(3) 前文链接:http://www.cnblogs.com/pmer/p/3322429.html 5,atexit wit ...
- Remobjects使用经验
RemObjects RemObjects提示:我们相信本文是正确的,但我们不做任何保证.在此感谢Henrick 写的文章,很高兴在此发表. 介绍RemObjects是功能强大可扩展的远程框架;但是当 ...
- javaSocket与C通信
前段时间写了个web端与C服务端之间的通信不过用的是短连接 非堵塞的方式,一直想使用长连接,使tomcat启动的时候就和C服务端进行通信,但是一直没找到方法希望je的朋友能给点思路.先来看我现在的具体 ...
- Mutex 实现进程独占资源
背景:开发一套依赖硬件运行的软件,为避免硬件资源调用冲突,一个时间内只允许运行一个软件进程. 方法:使用Mutex判断该软件是否已启动,如果是,关闭即将启动的软件. 代码: static class ...
- 某大神C#框架后台发送信息的查找及破解
最近在博客园瞎逛的时候,发现了某个大神发布的一个c#框架,一看框架,叫牛逼框架,嗯,装B效果太好了,界面很炫,虽然有很多的组件还是不怎么完善,但是,已经可以初步运用于项目了. 先来看看界面: 在进 ...