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 ...
随机推荐
- 【ios开发】图片拉伸
最近在做一个项目 其中要自己定制一个View 如图: 但是美工给了我的图片尺寸却是不一样的. 分别是599*80 26*61 于是就成了这样的效果. 很明显的发现取消四周不对劲. 于是我就去找美工姐 ...
- WebForm和Asp.Net MVC的理解
我对WebForm和Asp.Net MVC的理解 比较WebForm和Mvc的请求处理方式 首先简单了解一下Asp.Net中怎么对页面进行请求处理的: 在管道的第7-8个事件之间,有一个MapHt ...
- bios和dos中断
1.字符功能调用类(Character-Oriented Function)01H.07H和08H —从标准输入设备输入字符02H —字符输出03H —辅助设备的输入04H —辅助设备的输出05H — ...
- [google面试CTCI] 1-5.替换字符串中特定字符
[字符串与数组] Q:Write a method to replace all spaces in a string with ‘%20’ 题目:写一个算法将一个字符串中的空格替换成%20 解答: ...
- 将JSON映射为实体对象(iOS篇)
将JSON映射为实体对象(iOS篇) iOS开发人员已经习惯于将JSON转换为字典或者数组来进行操作了,接下来我要做的事情,可能匪夷所思,但是,对WP和Android开发人员而言,他们更倾向于将JSO ...
- 验证码生成组件--JCaptcha的使用
以下为项目中所用代码,文笔有限,直接上代码. 所需jar包: 是否需要其他依赖包,不详 web.xml <servlet> <servlet-name>Jcaptcha< ...
- 搜索广告与广告网络Demand技术-流式计算平台
流式计算平台-Storm 我们以Storm为例来看流式计算的功能是什么. 下面内容引用自大圆的博客.在Storm中,一个实时应用的计算任务被打包作为Topology发布,这同Hadoop的MapRed ...
- (Java 多线程系列)java volatile详解
在前面的文章里面介绍了synchronized关键字的用法,这篇主要介绍volatile关键字的用法. Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其它 ...
- 有一个array的数组,长度为10000,大小不一,用算法找出该数组中的最大值。
不用算法的答案是: var a=[1,2,3,5……];alert(Math.max.apply(null, a));//最大值alert(Math.min.apply(null, a));//最 ...
- Arduino 3g shield using GSM bought from ITead
This is an old arduino 3G module bought half years ago. Its wiki: http://wiki.iteadstudio.com/ITEAD_ ...