题目大意:给你一棵树,有两个操作1.修改一条边的值,2.询问从x到y路径上边的最大值

思路:如果树退化成一条链的话线段树就很明显了,然后这题就是套了个树连剖分,调了很久终于调出来第一个模板了

 #include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100009
using namespace std;
int head[maxn],next[maxn*],point[maxn],son[maxn],size_k[maxn],id[maxn],value[maxn],now=,father[maxn],top[maxn];
int x[maxn],y[maxn],v[maxn],tree[maxn*],pos=,deep[maxn],n;
int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void add(int x,int y,int v)
{
next[++now]=head[x];head[x]=now;
point[now]=y;value[now]=v;
}
int dfs(int k,int fa)
{
deep[k]=deep[fa]+;
father[k]=fa;
size_k[k]=;
int max_x=-;
son[k]=-;
for(int i=head[k];i;i=next[i])
{
if(point[i]==fa)continue;
dfs(point[i],k);
size_k[k]+=size_k[point[i]];
if(size_k[point[i]]>max_x)
{
max_x=size_k[point[i]];
son[k]=point[i];
}
}
}
void dfs2(int k,int fa,int pa)
{
id[k]=++pos;
top[k]=pa;
if(son[k]!=-)dfs2(son[k],k,pa);
for(int i=head[k];i;i=next[i])
{
if(point[i]!=fa && point[i]!=son[k])dfs2(point[i],k,point[i]);
}
}
void update(int node,int l,int r,int pos,int x)
{
if(l+==r){tree[node]=x;return;}
int mid=(l+r)>>;
if(pos<mid)update(node*,l,mid,pos,x);
else update(node*+,mid,r,pos,x);
tree[node]=max(tree[node*],tree[node*+]);
}
int query(int node,int l,int r,int ql,int qr)
{
if(ql<=l && r<=qr)return tree[node];
int mid=(l+r)>>;
int ans=-0x3f3f3f3f;
if(ql<mid)ans=max(query(node<<,l,mid,ql,qr),ans);
if(mid<qr)ans=max(query(node<<|,mid,r,ql,qr),ans);
return ans;
}
int find(int x,int y)
{
int fa=top[x],fb=top[y],temp=;
while(fa!=fb)
{
if(deep[fa]<deep[fb])
{
swap(fa,fb);
swap(x,y);
}
if(id[fa]>id[x]+)return -;
temp=max(temp,query(,,pos+,id[fa],id[x]+));
x=father[fa];fa=top[x];
}
if(x==y)return temp;
if(deep[x]<deep[y])swap(x,y);
if(id[y]+>id[x]+)return -;
return max(temp,query(,,pos+,id[son[y]],id[x]+));
}
int main()
{
int t;
t=read();
while(t--)
{
now=;
memset(head,,sizeof(head));
memset(tree,,sizeof(tree));
n=read();
for(int i=;i<n;i++)
{
x[i]=read();y[i]=read();v[i]=read();
add(x[i],y[i],v[i]);
add(y[i],x[i],v[i]);
}
deep[]=;
dfs(,);
dfs2(,,);
for(int i=;i<=n-;i++)
{
int u=deep[x[i]]>deep[y[i]]?x[i]:y[i];
update(,,pos+,id[u],v[i]);
}
int xx,yy;
char ch[];
while(true)
{
scanf("%s",ch);
if(ch[]=='D')break;
xx=read();yy=read();
if(ch[]=='Q')
{
printf("%d\n",find(xx,yy));
}
else if(ch[]=='C')
{
int u=deep[x[xx]]>deep[y[xx]]?x[xx]:y[xx];
update(,,pos+,id[u],yy);
}
else if(ch[]=='D')
{
break;
}
}
}
return ;
}

SPOJ 375 Query on a tree【树链剖分】的更多相关文章

  1. spoj 375 Query on a tree (树链剖分)

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

  2. SPOJ 375 Query on a tree 树链剖分模板

    第一次写树剖~ #include<iostream> #include<cstring> #include<cstdio> #define L(u) u<&l ...

  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 Query on a tree ——树链剖分 线段树

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

  6. SPOJ QTREE Query on a tree --树链剖分

    题意:给一棵树,每次更新某条边或者查询u->v路径上的边权最大值. 解法:做过上一题,这题就没太大问题了,以终点的标号作为边的标号,因为dfs只能给点分配位置,而一棵树每条树边的终点只有一个. ...

  7. spoj 375 QTREE - Query on a tree 树链剖分

    题目链接 给一棵树, 每条边有权值, 两种操作, 一种是将一条边的权值改变, 一种是询问u到v路径上最大的边的权值. 树链剖分模板. #include <iostream> #includ ...

  8. SPOJ Query on a tree 树链剖分 水题

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

  9. Query on a tree——树链剖分整理

    树链剖分整理 树链剖分就是把树拆成一系列链,然后用数据结构对链进行维护. 通常的剖分方法是轻重链剖分,所谓轻重链就是对于节点u的所有子结点v,size[v]最大的v与u的边是重边,其它边是轻边,其中s ...

  10. Bzoj 2588 Spoj 10628. Count on a tree(树链剖分LCA+主席树)

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MB Description 给定一棵N个节点的树,每个点 ...

随机推荐

  1. 浅析linux下软件的安装

    Linux环境: CentOs 6.0 知识点介绍: 一.tarball安装 安装步骤: 将tarball文件在/usr/local/src目录解压缩 ./configure:这个步骤是建立makef ...

  2. 使用 Visual Studio 2017 部署 Azure 应用服务的 Web 应用

    本快速入门介绍了如何使用 Visual Studio 2017 创建并部署 Azure Web 应用.在本教程中完成的所有操作均符合1元试用条件. 本快速入门介绍了如何使用 Visual Studio ...

  3. org.springframework.beans.factory.BeanCreationException: Could not autowire

    由于我在项目中引用了如下代码,增加了 @Configurationpublic class Connection {    public @Bean HttpClientConfig httpClie ...

  4. codeforces Gym 100338F Spam Filter 垃圾邮件过滤器(模拟,实现)

    阅读题, 概要:给出垃圾邮件和非垃圾邮件的集合,然后按照题目给出的贝叶斯公式计算概率一封邮件是垃圾邮件的概率. 逐个单词判断,将公式化简一下就是在垃圾邮件中出现的次数和在总次数的比值,大于二分之一就算 ...

  5. 想转行做web前端工程师,必学这5大技能!知道是那些吗?

    web前端工程师是近几年才发展出来的新兴职业,也是目前火爆且高薪的职业. 大需求的市场环境下,出现了越来越多的人群转行做web前端工程师,如设计师.后台程序员.网虫.大学其他专业.策划.编辑等等. 要 ...

  6. softmax_loss的归一化问题

    cnn网络中,网络更新一次参数是根据loss反向传播来,这个loss是一个batch_size的图像前向传播得到的loss和除以batch_size大小得到的平均loss. softmax_loss前 ...

  7. python 实例方法,类方法,静态方法,普通函数

    python中有实例方法,类方法,静态方法,普通函数 类方法需要@ classmethod 修饰并且有个隐藏参数 cls,实例方法必须有个参数 self, 静态方法必须有 @staticmethod修 ...

  8. C-基础:表达式中存在有符号类型和无符号类型时,都自动转换为无符号类型

    void foo(void) { unsigned ; ; (a+b > ) puts("> 6") : puts("<= 6"); } 答案 ...

  9. 电脑上文件的后缀名被隐藏,把一个文本文件改成.bat时,默认打开的还是文本。

    1.打开文件夹,选择组织,点击“文件夹和搜索选项”,如图: 2.选择“查看”,找到“隐藏已知文件类型的扩展名”,不要勾选这一项,如图: 3.点击“确定”或者“应用”

  10. kubernetes添加不了google apt-key

    转自icepoint的博客 key来源 我的百度云盘 密码:v3wo 下载kube_apt_key.gpg到本地,上传到服务器后执行下面的命令 apt-get update && ap ...