树剖模板,注意把边化为点后要查到y的儿子。

 #include<bits/stdc++.h>
using namespace std;
const int N=;
int f[N],bel[N],w[N],id[N],pos[N],d[N],size[N],son[N],head[N];
int n,idx,cnt,num,T,rt;
struct node
{
int l,r,s,mx;
void clean()
{
l=r=s=mx=-1e9;
}
}t[N<<];
struct edge
{
int to,nex,w,x;
}e[N<<],a[N];
void add(int x,int y,int w)
{
e[++cnt].to=y;e[cnt].nex=head[x];head[x]=cnt;e[cnt].x=x;
}
void dfs1(int x,int fa)
{
size[x]=;
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(y==fa)continue;
f[y]=x;d[y]=d[x]+;
dfs1(y,x);
if(size[y]>size[son[x]])son[x]=y;
size[x]+=size[y];
}
return;
}
void dfs2(int x,int chain)
{
bel[x]=chain;pos[x]=++idx;id[idx]=x;
if(son[x])dfs2(son[x],chain);
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(y==f[x]||y==son[x])continue;
dfs2(y,y);
}
}
void build(int &x,int l,int r)
{
x=++num;
if(l==r){
t[x].s=t[x].mx=w[l];return;
}
int mid=l+r>>;
build(t[x].l,l,mid);build(t[x].r,mid+,r);
t[x].mx=max(t[t[x].l].mx,t[t[x].r].mx);
return;
}
int query(int x,int l,int r,int L,int R)
{
if(l==L&&r==R)return t[x].mx;
int mid=l+r>>;
if(R<=mid)return query(t[x].l,l,mid,L,R);
else if(L>mid)return query(t[x].r,mid+,r,L,R);
else return max(query(t[x].l,l,mid,L,mid),query(t[x].r,mid+,r,mid+,R));
}
void change(int x,int l,int r,int pos,int ww)
{
if(l==r){t[x].s=t[x].mx=ww;return;}
int mid=l+r>>;
if(pos<=mid)change(t[x].l,l,mid,pos,ww);
else change(t[x].r,mid+,r,pos,ww);
t[x].mx=max(t[t[x].l].mx,t[t[x].r].mx);
}
int querytree(int x,int y)
{
int ans=-1e9;
while(bel[x]!=bel[y])
{
if(d[bel[x]]<d[bel[y]])swap(x,y);
ans=max(ans,query(rt,,n,pos[bel[x]],pos[x]));
x=f[bel[x]];
}
if(d[x]<d[y])swap(x,y);
if(d[son[y]]<=d[x])
ans=max(ans,query(rt,,n,pos[son[y]],pos[x]));
return ans;
}
void init()
{
memset(f,,sizeof(f));
memset(d,,sizeof(d));
memset(size,,sizeof(size));
memset(son,,sizeof(son));
memset(bel,,sizeof(bel));
memset(pos,,sizeof(pos));
memset(head,,sizeof(head));
memset(id,,sizeof(id));
memset(w,,sizeof(w));cnt=idx=num=;rt=;
for(int i=;i<=num;++i)t[i].clean();
}
int main()
{
scanf("%d",&T);
while(T--)
{
init();int x,y,ww;
scanf("%d",&n);
for(int i=;i<n;++i)
{
scanf("%d%d%d",&x,&y,&ww);
add(x,y,ww);add(y,x,ww);
a[i].x=x;a[i].to=y;a[i].w=ww;
}
dfs1(,);dfs2(,);
build(rt,,n);char s[];
for(int i=;i<n;i++)
{
x=d[a[i].x]>d[a[i].to]?a[i].x:a[i].to;
change(rt,,n,pos[x],a[i].w);
}
change(rt,,n,pos[],-1e9);
while()
{
scanf("%s",s);
if(s[]=='D')break;
if(s[]=='Q')
{
scanf("%d%d",&x,&y);
printf("%d\n",querytree(x,y));
}
else
{
scanf("%d%d",&x,&y);
x=d[a[x].x]>d[a[x].to]?a[x].x:a[x].to;
change(rt,,n,pos[x],y);
}
}
}
return ;
}

QTREEⅠ SPOJ的更多相关文章

  1. QTREE 树链剖分---模板 spoj QTREE

    <树链剖分及其应用> 一文讲得非常清楚,我一早上就把他学会了并且A了这题的入门题. spoj QTREE 题目: 给出一棵树,有两种操作: 1.修改一条边的边权. 2.询问节点a到b的最大 ...

  2. SPOJ QTREE 系列解题报告

    题目一 : SPOJ 375 Query On a Tree http://www.spoj.com/problems/QTREE/ 给一个树,求a,b路径上最大边权,或者修改a,b边权为t. #in ...

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

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

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

  5. SPOJ QTREE

    QTREE /* 题目大意:维护一棵树,允许修改边权以及查询链上最大值 题解:我们将边权转为点权,标记在深度较深的点上,树链剖分后用线段树处理即可 */ #include <cstdio> ...

  6. SPOJ 375 Query on a tree(树链剖分)(QTREE)

    You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

  7. SPOJ QTREE Query on a tree ——树链剖分 线段树

    [题目分析] 垃圾vjudge又挂了. 树链剖分裸题. 垃圾spoj,交了好几次,基本没改动却过了. [代码](自带常数,是别人的2倍左右) #include <cstdio> #incl ...

  8. 【学术篇】SPOJ QTREE 树链剖分

    发现链剖这东西好久不写想一遍写对是有难度的.. 果然是熟能生巧吧.. WC的dalao们都回来了 然后就用WC的毒瘤题荼毒了我们一波, 本来想打个T1 44分暴力 然后好像是特判写挂了还是怎么的就只能 ...

  9. SPOJ QTree【树链剖分】

    一 题目 QTREE 二 分析 第一道树链剖分的题,写的好艰难啊. 题意还是比较好理解的,就是在树上操作. 对于修改,题中要求的是单点修改,就算是直接树上操作也是非常简单的. 对于查询,查询的时候,是 ...

随机推荐

  1. Razor使用Parse()时最好指定“缓存名”

    为什么? 本文的标题,明显有一种提醒的口吻. 从18年的生活经验看,如果想提醒人要怎么办,不要怎么办. 最好说明原因.那么小编开始说明原因喽. 哦对,说原因之前,先说交代一下背景,一句话 在非mvc下 ...

  2. css3同心圆闪烁扩散效果

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  3. python常用库之base64

    1. 什么是base64 base64是一种将不可见字符转换为可见字符的编码方式. 2. 如何使用 最简单的使用方式 import base64 if __name__ == '__main__': ...

  4. oracle数据库的date和timestamp类型

    1.date类型存储数据的格式为年月日时分秒,可以精确到秒 timestamp类型存储数据的格式为年月日时分秒,可以精确到纳秒(9位) 2.date类型 Date类型的数据可以显示到年月日,也可以显示 ...

  5. ThinkPHP自定义错误页面、成功页面及异常页面

    为什么会选择 ThinkPHP 呢?首先,作为一款国产PHP框架,文档肯定比国外那些框架要丰富的多,而且容易看懂:其次,ThinkPHP已经发展了七八年的时间了,相对来说已经比较成熟了:当然,最重要的 ...

  6. [转载]PM管理技巧

      产品经理的沟通策略 2016年10月11日/分类: 文章 /编辑: Amy 产品经理处于沟通枢纽的位置,工作中需要跟各种岗位的人打交道,比如:领导.开发.运营.客户.用户.合作伙伴… 沟通能力是产 ...

  7. iphone6设置企业qq

    1.首先要确定foxmail的账户服务器信息,右上角-账户账户管理-服务器设置 2.iphone端:

  8. 【bzoj4293】【PA2015】Siano

    如题,首先可以考虑相对大小是不变的. 那么先sort,之后每次在线段树上二分即可. #include<bits/stdc++.h> typedef long long ll; using ...

  9. 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树

    题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...

  10. FPM定制RPM包

    安装FPM FPM是ruby写的打包工具,ruby版本要大于1.8.5 #安装ruby环境和gem包管理器 [root@test88 ~]# yum install -y ruby rubygems ...