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的更多相关文章

  1. 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 ...

  2. SP375 QTREE - Query on a tree (树剖)

    题目 SP375 QTREE - Query on a tree 解析 也就是个蓝题,因为比较长 树剖裸题(基本上),单点修改,链上查询. 顺便来说一下链上操作时如何将边上的操作转化为点上的操作: 可 ...

  3. SPOJ VJudge QTREE - Query on a tree

    Query on a tree Time Limit: 851MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Submi ...

  4. spoj QTREE - Query on a tree(树链剖分+线段树单点更新,区间查询)

    传送门:Problem QTREE https://www.cnblogs.com/violet-acmer/p/9711441.html 题解: 树链剖分的模板题,看代码比看文字解析理解来的快~~~ ...

  5. SPOJ QTREE Query on a tree --树链剖分

    题意:给一棵树,每次更新某条边或者查询u->v路径上的边权最大值. 解法:做过上一题,这题就没太大问题了,以终点的标号作为边的标号,因为dfs只能给点分配位置,而一棵树每条树边的终点只有一个. ...

  6. SPOJ375 QTREE - Query on a tree

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  7. SP375 QTREE - Query on a tree

    题意大意 给定\(n\)个点的树,边按输入顺序编号为\(1,2,...n-1\),要求作以下操作: CHANGE \(i\) \(t_i\) 将第\(i\)条边权值改为\(t_i\),QUERY \( ...

  8. 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 ...

  9. 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 ...

随机推荐

  1. MongoDB应用介绍之前

    MongoDb企业应用实战(一) 写在MongoDB应用介绍之前   故事背景: 本人有幸,经老友( 现为x知名快递公司技术总监 ) 推荐进入中国前三大民营快递公司之一工作,在此非常感谢他,在此也非常 ...

  2. VIJOS1107 求树的最长链

    vijos1107环游大同80天 学习了一下求树的最长链的方法 最简单的思路就是两次dfs 两次dfs分别有什么用呢? 第一次dfs,求出某个任意的点能到达的最远的点 第二次dfs,从所搜到的最远的点 ...

  3. Day4:T1小技巧(类似于指针操作)T2搜索+小细节

    Day4:其中有很多小技巧get T1 一直没有听到过像这样的小技巧的略专业名词,有点类似于指针操作,之前有碰到过很多这样的题目 每次都是以不同的形式出现,但是感觉思想还是有点接近的吧(就比如某天有一 ...

  4. 大数据之HBase

    大数据之HBase数据插入优化之多线程并行插入实测案例 一.引言: 上篇文章提起关于HBase插入性能优化设计到的五个参数,从参数配置的角度给大家提供了一个性能测试环境的实验代码.根据网友的反馈,基于 ...

  5. 简单的mvc之三:灵活的路由(上)

    在上一篇关于管线的随笔中已经提及了管线,通过对管线的分析,我们可以得到下面几个结论:路由系统由URLRoutingModule模块实现,它订阅了PostResolvRequestCache事件:路由系 ...

  6. .NET接口和类 反射的差异性发现

    1 背景 在项目中使用反射,反射出某类型的所有属性(Property)和对应的属性值.起初为了性能考虑在模块首次加载就反射类型的所有属性并将其存入字典.根据一般的编程规范——基于接口编程,所以首次传入 ...

  7. ASP.NET Web API的消息处理管道: HttpRoutingDispatcher

    ASP.NET Web API的消息处理管道: HttpRoutingDispatcher 认情况下,作为消息处理管道“龙头”的HttpServer的Dispatcher属性返回一个HttpRouti ...

  8. 完整显示当前日期和时间的JS代码(2007年2月25日星期日正午12:42:48)

    代码演示效果为“2007年2月25日星期日正午12:42:48”. 使用方法:将下面的JS代码放到你想要显示的页面中(支持HTML页面),然后在你想要显示时间的位置插入下面的代码即可 <div ...

  9. LoadTest中内存和线程Troubleshooting实战

    LoadTest中内存和线程Troubleshooting实战 在端午节放假的三天中,我对正在开发的Service进行了LoadTest,尝试在增大压力的条件下发现问题. 该Service为独立进程的 ...

  10. 一种利用异常机制基于MVC过滤器的防止重复提交的机制分享

    防止重复提交验证机制 某些时候因为系统反应稍慢,急性子用户可能不耐烦会进行重复的提交,这个操作不仅可能造成系统负担,也可能产生垃圾数据. 出现这两种状况都是我们不希望的. 为此,在公司项目系统设计了以 ...