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 ...
随机推荐
- Memcached缓存入门篇
Asp.Net中使用Couchbase——Memcached缓存入门篇 前言 本文的主要目的就是简单的进行使用Memcached.这是Memchahed的官网http://memcached.org/ ...
- JSON.NET基本使用
序列化一个对象 public static string ToJson( object obj) { string json = JsonConvert .SerializeObject(obj); ...
- 一个HttpWebRequest工具类
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.N ...
- [转]ARM/Thumb/Thumb-2
ref:http://kmittal82.wordpress.com/2012/02/17/armthumbthumb-2/ A few months ago I gave a presentatio ...
- Cassandra
NoSQL之Cassandra 9月初听了一个讲座,演讲者是张月同学,他给我们分享了Cassandra nosql数据库,讲得很精彩,听完之后收益良多. Cassandra是一个noSQL数据库, ...
- oracle中sys和System的默认密码
sys:change_on_install system:oracle 如果用pl/sql登录的话,记得在下面用户权限选项选择sysdba,如图所示:
- 项目Splash页面的开发与设计
项目Splash页面的开发与设计 首先建立一个安卓的项目,然后修改manifest.xml文件,修改应用程序的logo和显示名称,效果图如下: 对应的代码如下: 1 <?xml version= ...
- HTML5-WebSocket-初探
1.环境准备 主要是用<HTML5 程序设计>(第二版)作为学习参考资料.但是上面用的WebSocket服务器是用python写的.偶不懂python,于是得找另外一个替代实现,这里适用n ...
- 使用Guava进行函数式编程
本文翻译自Getting Started with Google Guava这本书,如有翻译不足的地方请指出. 在这一章,我们开始注意到使用Guava进行编写代码会更加简单.我们将看看如何使用Guav ...
- Entity Framework实体模型 入门视频教程
Entity Framework实体模型 入门视频教程 恢复内容开始--- 第一步 创建一个 控制台应用程序 第二步 创建一个ADO.NET 数据实体模型 DbModel.edmx 需要跟数据库进行连 ...