题解:

树链剖分的模板题

具体代码详见网上的其他代码

代码:

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
char s[];
int data[N],p[N],n,pos,fp[N],num[N];
int x,y,z,tot,top[N],T,e[N][],val[N],deep[N],son[N],fa[N],ne[N],fi[N],zz[N];
void jb(int x,int y)
{
ne[++tot]=fi[x];
fi[x]=tot;
zz[tot]=y;
}
void dfs1(int x,int y,int z)
{
deep[x]=z;
fa[x]=y;
for (int i=fi[x];i;i=ne[i])
{
int k=zz[i];
if (k!=y)
{
dfs1(k,x,z+);
num[x]+=num[k];
if (son[x]==-||(num[son[x]]<num[k]))son[x]=k;
}
}
}
void dfs2(int x,int y)
{
top[x]=y;
if (son[x]!=-)
{
p[x]=pos++;
fp[p[x]]=x;
dfs2(son[x],y);
}
else
{
p[x]=pos++;
fp[p[x]]=x;
return;
}
for (int i=fi[x];i;i=ne[i])
if (zz[i]!=son[x]&&zz[i]!=fa[x])
dfs2(zz[i],zz[i]);
}
void pushup(int x)
{
data[x]=max(data[x*],data[x*+]);
}
void build(int l,int r,int x)
{
if (l==r)
{
data[x]=val[l];
return;
}
int mid=(l+r)/;
build(l,mid,x*);
build(mid+,r,x*+);
pushup(x);
}
void updata(int p,int q,int l,int r,int x)
{
if (l==r)
{
data[x]=q;
return;
}
int mid=(l+r)/;
if (p<=mid)updata(p,q,l,mid,x*);
else updata(p,q,mid+,r,x*+);
pushup(x);
}
int query(int x,int y,int l,int r,int s)
{
if (x>r||y<l)return ;
if (x<=l&&y>=r)return data[s];
int mid=(l+r)/;
return max(query(x,y,l,mid,s*),query(x,y,mid+,r,s*+));
}
int find(int x,int y)
{
int f1=top[x],f2=top[y],temp=;
while (f1!=f2)
{
if (deep[f1]<deep[f2])
{
swap(x,y);
swap(f1,f2);
}
temp=max(temp,query(p[f1],p[x],,n,));
x=fa[f1],f1=top[x];
}
if (x==y)return temp;
if (deep[x]>deep[y])swap(x,y);
return max(temp,query(p[son[x]],p[y],,n,));
}
int read()
{
int x=;char c;
for (;c<''||c>'';c=getchar());
for (;c>=''&&c<='';c=getchar())x=x*+c-;
return x;
}
int main()
{
scanf("%d",&T);
while (T--)
{
pos=;tot=;
memset(fi,,sizeof fi);
memset(son,-,sizeof son);
memset(data,,sizeof data);
scanf("%d",&n);
for (int i=;i<n-;i++)
{
scanf("%d%d%d",&e[i][],&e[i][],&e[i][]);
jb(e[i][],e[i][]);jb(e[i][],e[i][]);
}
dfs1(,,);
dfs2(,);
for (int i=;i<n-;i++)
{
if (deep[e[i][]]<deep[e[i][]])swap(e[i][],e[i][]);
val[p[e[i][]]]=e[i][];
}
build(,n,);
while (scanf("%s",&s))
{
if (s[]=='D')break;
x=read();y=read();
if (s[]=='Q')printf("%d\n",find(x,y));
else updata(p[e[x-][]],y,,n,);
}
}
return ;
}

spoj375的更多相关文章

  1. Cogs 1672. [SPOJ375 QTREE]难存的情缘 LCT,树链剖分,填坑计划

    题目:http://cojs.tk/cogs/problem/problem.php?pid=1672 1672. [SPOJ375 QTREE]难存的情缘 ★★★☆   输入文件:qtree.in  ...

  2. 树链剖分边权模板spoj375

    树链剖分是树分解成多条链来解决树上两点之间的路径上的问题 如何求出树链:第一次dfs求出树上每个结点的大小和深度和最大的儿子,第二次dfs就能将最大的儿子串起来并hash(映射)到线段树上(或者其他数 ...

  3. Spoj375 Qtree--树链剖分

    Spoj375 Qtree给一棵共有 n(n · 10000) 个结点的树, 每条边都有一个权值, 要求维护一个数据结构, 支持如下操作: 1. 修改某条边的权值; 2. 询问某两个结点之间的唯一通路 ...

  4. SPOJ375 Query on a tree

    Description You are given a tree (an acyclic undirected connected graph) with N nodes, and edges num ...

  5. SPOJ375 Query on a tree(LCT边权)

    之前做了两道点权的LCT,这次做一下边权的LCT.上网找了一下资料,发现对于边权的LCT有这么两种处理方法,一种是每条边建一个点,于是边权就转成点权了.另外一种则是每个边权对应到点权上,也就是每个点对 ...

  6. SPOJ375.QTREE树链剖分

    题意:一个树,a b c 代表a--b边的权值为c.CHANGE x y  把输入的第x条边的权值改为y,QUERY x y 查询x--y路径上边的权值的最大值. 第一次写树链剖分,其实树链剖分只能说 ...

  7. SPOJ375(树链剖分)

    题目:Query on a tree 题意:给定一棵树,告诉了每条边的权值,然后给出两种操作: (1)把第i条边的权值改为val (2)询问a,b路径上权值最大的边 分析:本题与HDU3966差不多, ...

  8. 树链剖分-SPOJ375(QTREE)

    QTREE - Query on a tree You are given a tree (an acyclic undirected connected graph) with N nodes, a ...

  9. [SPOJ375]QTREE - Query on a tree【树链剖分】

    题目描述 给你一棵树,两种操作. 修改边权,查找边权的最大值. 分析 我们都知道,树链剖分能够维护点权. 而且每一条边只有一个,且唯一对应一个儿子节点,那么就把信息放到这个儿子节点上. 注意,lca的 ...

随机推荐

  1. Go第七篇之规范的接口

    接口本身是调用方和实现方均需要遵守的一种协议,大家按照统一的方法命名参数类型和数量来协调逻辑处理的过程. Go 语言中使用组合实现对象特性的描述.对象的内部使用结构体内嵌组合对象应该具有的特性,对外通 ...

  2. 骁龙820和KryoCPU:异构计算与定制计算的作用 【转】

    本文转载自:https://www.douban.com/group/topic/89037625/ Qualcomm骁龙820处理器专为提供创新用户体验的顶级移动终端而设计.为实现消费者所期望的创新 ...

  3. [pytorch]pytorch loss function 总结

    原文: http://www.voidcn.com/article/p-rtzqgqkz-bpg.html 最近看了下 PyTorch 的损失函数文档,整理了下自己的理解,重新格式化了公式如下,以便以 ...

  4. 51nod 1693 水群(神奇的最短路!)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1693 题意: 思路: 这个思路真是神了.. 对于每个点$i$,它需要和$ ...

  5. 【网络知识】【1】http、tcp/udp、soap的区别

    一句话总结: soap信息可以通过http协议包装后通过tcp或udp传输 参考:https://zhidao.baidu.com/question/617706398106243452.html

  6. C++:几种callable实现方式的性能对比

    C++中几种callable实现方式的性能对比 前言 C++中想实现一个callable的对象,通常有四种方式: std::function:最common的方式,一般会配合std::bind使用. ...

  7. Cocos2d-x学习笔记(二)AppDelegate类详解

    由源代码,可得到如下的类继承关系: 1. 在方法applicationDidFinishLaunching中,首先会调用CCDirector* pDirector = CCDirector::shar ...

  8. python 元组列表转为字典

    #create a list l = [(), (), (), (), (), ()] d = {} for a, b in l: d.setdefault(a, []).append(b) prin ...

  9. Mac OS下安装mvn

    Step1: 去官网地址下载 http://maven.apache.org/download.cgi Step2: 解压并且移动到指定到目录下 Step3: 配置环境变量并使之生效 .bash_pr ...

  10. 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。

    一.需要分析 1.输入为一个字符串和字节数,输出为按字节截取的字符串--->按照字节[byte]截取操作字符串,先将String转换成byte类型 2.汉字不可以截半--->汉字截半的话对 ...