题目大意:

  一棵树,有边权,有两个操作:1.修改一条边的权值;2.询问两点间路径上的边的权值的最大值。

思路:

  十分裸的树链剖分+线段树,无非是边权要放到深度大的一端的点上,但是有两个坑爹的地方,改了好久:

  1.数组定义10000和40000会TLE,要乘10;

  2.以前的树剖求解的最后是这样的:

    if (deep[x]>deep[y]) swap(x,y);
return max(ans,MAX(,n,id[x],id[y],));

  但是WA了,膜拜大神后发现这样就AC了:

    if (x==y) return ans;
if (dep[x]>dep[y]) swap(x,y);
return max(ans,ask(,n,id[x]+,id[y],));

  以前应该是错了。

代码:

 #include<cstdio>
#include<iostream>
using namespace std;
const int M=;
int n,cnt,t,p[M],hea[M],size[M],v[M],a[M],b[M],c[M],nex[M],dep[M],top[M],id[M],tree[M<<];
char s[M]; bool vis[M]; int read()
{
int x=; bool f=; char ch=getchar();
while (ch<'' || ch>'') { if (ch=='-') f=; ch=getchar(); }
while (ch>='' && ch<='') x=(x<<)+(x<<)+ch-,ch=getchar();
return f?-x:x;
} void add(int x,int y) { v[++cnt]=y,nex[cnt]=hea[x],hea[x]=cnt; } void dfs1(int x,int fa,int h)
{
size[x]=,dep[x]=h,p[x]=fa;
for (int i=hea[x],y;i;i=nex[i])
if ((y=v[i])^fa) dfs1(y,x,h+),size[x]+=size[y];
} void dfs2(int x,int chain)
{
int i,k=,y;
id[x]=++t,top[x]=chain;
for (i=hea[x];i;i=nex[i])
if (size[y=v[i]]>size[k] && y^p[x]) k=y;
if (!k) return; dfs2(k,chain);
for (i=hea[x];i;i=nex[i])
if ((y=v[i])^p[x] && k^y) dfs2(y,y);
} void push_up(int k) { tree[k]=max(tree[k<<],tree[k<<|]); } void change(int L,int R,int x,int val,int cur)
{
if (L==R) { tree[cur]=val; return; }
int mid=L+R>>;
if (x>mid) change(mid+,R,x,val,cur<<|);
else change(L,mid,x,val,cur<<);
push_up(cur);
} int ask(int L,int R,int l,int r,int cur)
{
if (l<=L && R<=r) return tree[cur];
int mid=L+R>>;
if (r<=mid) return ask(L,mid,l,r,cur<<);
else if (l>mid) return ask(mid+,R,l,r,cur<<|);
else return max(ask(L,mid,l,mid,cur<<),ask(mid+,R,mid+,r,cur<<|));
} int qry(int x,int y)
{
int ans=-;
for (;top[x]^top[y];x=p[top[x]])
{
if (dep[top[x]]<dep[top[y]]) swap(x,y);
ans=max(ans,ask(,n,id[top[x]],id[x],));
}
if (x==y) return ans;
if (dep[x]>dep[y]) swap(x,y);
return max(ans,ask(,n,id[x]+,id[y],));
} int main()
{
for (int T=read(),i;T;--T)
{
n=read(),cnt=t=;
for (i=;i<=n;++i) hea[i]=;
for (i=;i<n;++i)
{
a[i]=read(),b[i]=read(),c[i]=read();
add(a[i],b[i]),add(b[i],a[i]);
}
dfs1(,,),dfs2(,);
for (i=;i<n;++i)
{
if (dep[a[i]]<dep[b[i]]) swap(a[i],b[i]);
change(,n,id[a[i]],c[i],);
}
for (;;)
{
scanf("%s",s);
if (s[]=='D') break;
int x=read(),y=read();
if (s[]=='C') change(,n,id[a[x]],y,);
if (s[]=='Q') printf("%d\n",qry(x,y));
}
}
return ;
}

SPOJ - QTREE Query on a tree题解的更多相关文章

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

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

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

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

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

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

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

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

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

  7. SPOJ QTREE - Query on a tree 【树链剖分模板】

    题目链接 引用到的大佬博客 代码来自:http://blog.csdn.net/jinglinxiao/article/details/72940746 具体算法讲解来自:http://blog.si ...

  8. SPOJ QTREE Query on a tree

    题意:给一颗n个点的树,有两种操作CHANGE i ti : 把第i条边的权变为tiQUERY a b : 问点a 到 点b 之间的边的最大权 思路:树剖处理边权.由于是边,所以只需要把边权处理到子节 ...

  9. SPOJ QTREE Query on a tree V ——动态点分治

    [题目分析] QTREE4的弱化版本 建立出分治树,每个节点的堆表示到改点的最近白点距离. 然后分治树上一直向上,取min即可. 正确性显然,不用担心出现在同一子树的情况(不会是最优解),请自行脑补. ...

随机推荐

  1. 题解报告:hdu 2059 龟兔赛跑

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2059 Problem Description 据说在很久很久以前,可怜的兔子经历了人生中最大的打击—— ...

  2. windows系统下如何正确安装Cygwin(图文详解)

    我的操作系统信息是 1.在官网https://cygwin.com/install.html下载win64位安装包 选择包的下载存放目录,点击“下一步”   为了使我们安装的Cygwin能够编译程序, ...

  3. AJPFX详解泛型中super和extends关键字

    首先,我们定义两个类,A和B,并且假设B继承自A.下面的代码中,定义了几个静态泛型方法,这几个例子随便写的,并不是特别完善,我们主要考量编译失败的问题: Java代码  public class Ge ...

  4. 电商网站项目Angular+Bootstrap+Node+Express+Mysql

    1.登陆 2.注册 3.主页 4.购物车 5.管理中心 6.文件上传 代码: https://github.com/Carol0311/min_Shop.git 后期会持续进行功能更新以及开发阶段遇到 ...

  5. JData 整合ArtTemplate的前端框架

    因为项目需要和自己的兴趣,几个月前结合模板解析神速的ArtTemplate,自己写了个框架取名JData,多多指教啊---因为一直没时间写文档,为了能够更方便地使用和避免我把代码忘了,今天抽空把文档写 ...

  6. [Android]AndroidDesign中ActionBar探究2 嵌入Fragment

    上一节我们只是简单了介绍了Android Design风格中的ActionBar的简单实用,如添加MenuItem,这节我们会进一步了解ActionBar的其他功能. 在Android Develop ...

  7. C#中的常量、类型推断和作用域

    一.常量 常量是其值在使用过程中不会发生变化的变量.在声明和初始化变量时,在变量前面家关键字const,就可以把该变量指定为一个常量: const int a=100;//a的值将不可以改变 常量的特 ...

  8. 简单探讨弹性布局flex

    css 弹性布局: 盒子模型: box-sizing属性1.content-box 正常的普通的盒子模型用padding和border会使盒子变大:(向外扩张)2.border-box 盒子模型,pa ...

  9. struts2通过配置文件进行数据校验无效

    网络搜集常见解决方案: 1. 首先应该注意validation.xml的名字,一定要以Action的类名加“-validation.xml”作为文件名,如LoginAction-validation. ...

  10. vba,excel,身份证,照片

    Sub 插入图片() '调整单元格大小,以适应图片大小 功能 插入身份证照片打印 - 正面在单元格d6       反面单元格d10 ActiveSheet.Pictures.Delete '清理过期 ...