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 ...
随机推荐
- AMQP(Advanced Message Queuing Protocol)
一套确定的消息交换功能,也就是“高级消息交换协议模型”.AMQP模型包括一套用于路由和存储消息的功能模块,以及一套在这些模块之间交换消息的规则. 一个网络线级协议(数据传输格式),客户端应用可以通过这 ...
- FineUI开源版之TreeGrid实现
FineUI开源版是没有树表格的,但是又需要,怎么办呢?在博客园看到一位大大的文章 http://www.cnblogs.com/shiworkyue/p/4211002.html 然后参考,不知道为 ...
- SQL2008R2 无法读取此系统上以前注册的服务器的列表--网上方法不可行
C:\Users\<username>\AppData\Local\Temp,然后创建两个命名为1和2的文件夹
- revel框架教程之缓存和Job
Go语言实战 - revel框架教程之缓存和Job 所有的网站应该都会有一个非常简单的需求,首页一秒之内打开. 满足的方式主要有两种: 页面静态化,效果最好,对服务器基本没负担,只要带宽足够就好了 ...
- 判断0-N之间出现1的次数
Console.WriteLine("请输入截止数字?退出请输入y"); string input = Console.ReadLine(); int n = Convert.To ...
- ASP.NET Web API的消息处理管道:"龙头"HttpServer
ASP.NET Web API的消息处理管道:"龙头"HttpServer 一般来说,对于构成ASP.NET Web API消息处理管道的所有HttpMessageHandler来 ...
- 定时器Timer不定时
订餐系统之定时器Timer不定时 经过几天漫长的问题分析.处理.测试.验证,定时器Timer终于定时了,于是开始了这篇文章,希望对还在纠结于“定时器Timer不定时”的同学有所帮助,现在的方案,在系统 ...
- IPC之消息队列详解与使用
一. 概念 消息队列就是一个消息的链表.对消息队列有写权限的进程可以向其中按照一定的规则添加新消息:对消息队列有读权限的进程可以从消息队列中读出消息.消息队列是随内核持续的.下面介绍三个概念: ...
- java ArrayList的序列化分析
一.绪论 所谓的JAVA序列化与反序列化,序列化就是将JAVA 对象以一种的形式保持,比如存放到硬盘,或是用于传输.反序列化是序列化的一个逆过程. JAVA规定被序列化的对象必须实现java.io.S ...
- ClassLoader的类结构分析
摘自深入分析java web技术内幕