树剖模板,注意把边化为点后要查到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. R1(上)—R关联规则分析之Arules包详解

    Arules包详解 包基本信息 发布日期:2014-12-07 题目:挖掘关联规则和频繁项集 描述:提供了一个表达.处理.分析事务数据和模式(频繁项集合关联规则)的基本框架. URL:http://R ...

  2. 【CodeForces】576 D. Flights for Regular Customers

    [题目]D. Flights for Regular Customers [题意]给定n个点m条边的有向图,每条边有di表示在经过该边前必须先经过di条边,边可重复经过,求1到n的最小经过边数.n,m ...

  3. 【CodeForces】626 F. Group Projects 动态规划

    [题目]F. Group Projects [题意]给定k和n个数字ai,要求分成若干集合使得每个集合内部极差的总和不超过k的方案数.n<=200,m<=1000,1<=ai< ...

  4. 使用JSON Web Token设计单点登录系统

    用户认证八步走 所谓用户认证(Authentication),就是让用户登录,并且在接下来的一段时间内让用户访问网站时可以使用其账户,而不需要再次登录的机制. 小知识:可别把用户认证和用户授权(Aut ...

  5. laravel后台返回ajax数据

    后台模式: $array = array('msg'=>'添加失败!','status'=>'false'); return json_encode($array); 前台显示: $.aj ...

  6. js刷题:leecode 25

    原题:https://leetcode.com/problems/reverse-nodes-in-k-group/ 题意就是给你一个有序链表.如1->2->3->4->5,还 ...

  7. js-打地鼠游戏开发

    [生成画布] 第1课[随机生成地鼠] 第2课[定时生成地鼠] 第3课[打地鼠完结篇] 第4课 优酷在线播放地址 http://list.youku.com/albumlist/show?id=2939 ...

  8. MongoDB之安装和基本使用(一)

    环境 ubuntu16.04 mongodb基本特点 MongoDB 是一个基于分布式 文件存储的NoSQL数据库;可以把MongoDB想象成一个大py字典. 模式自由 :可以把不同结构的文档存储在同 ...

  9. USB各种模式 解释

    1.MTP: 通过MTP这种技术,可以把音乐传到手机里.有了U盘功能为什么还要多此一举呢?因为版权问题,MTP可以把权限文件从电脑上导过去:如果只使用手机的U盘功能,把歌的文件拷过去之后,没有权限文件 ...

  10. 转 proc文件

    /proc 是一个伪文件系统, 被用作内核数据结构的接口, 而不仅仅是解释说明/dev/kmem. /proc 里的大多数文件都是只读的, 但也可以通过写一些文件来改变内核变量. 下面对整个 /pro ...