题目大意:

  一棵树,有边权,有两个操作: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 2546 饭卡(01背包)

    Problem Description 电子科大本部食堂的饭卡有一种很诡异的设计,即在购买之前判断余额.如果购买一个商品之前,卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负) ...

  2. solr之~模糊查询【转】

    solr之~模糊查询 有的时候,我们一开始不可能准确地知道搜索的关键字在 Solr 中查询出的结果是什么,因此,Solr 还提供了几种类型的模糊查询.模糊匹配会在索引中对关键字进行非精确匹配.例如,有 ...

  3. Android开发学习——android与服务器端数据交互

    1.首先搭建服务器端. 使用MyEclipse开发工具 public class MyServlet extends HttpServlet { @Override protected void do ...

  4. 腾讯云COS对象存储的简单使用

    叮当哥之前买了一年的腾讯云服务器,昨日偶然发现腾讯云送了叮当哥半年的cos对象存储服务器,于是就撸起袖子传了几张珍藏的高清大图上去,现将其上传的简单使用步骤总结一波(其它操作参加官方SDK文档API) ...

  5. mysql之通过cmd连接远程数据库

    ---恢复内容开始--- 目录 前提 连接远程数据库 前提: 本地安装了mysql数据库 本地和远程网络是连通的,通过命令ping ip (即ping 192.168.0.333),可以ping通 连 ...

  6. poj3685 Matrix

    思路: 二分套二分. 矩阵在每一列上是严格递增的,可以利用这一点进行二分. 实现: #include <cstdio> #include <cmath> #include &l ...

  7. Nginx server_name 正则泛域名反向代理两例

    最近在学习Nginx搭建负载均衡系统,感觉系统部署方式的思路瞬间开阔了很多. 负载均衡服务器的后端服务器上各自有一套功能相同的WEB管理系统,主要作用是方便的对各自服务器的IIS站点及服务器防火墙测量 ...

  8. koa2实现简易的webpack-dev-server

    koa2实现简易的webpack-dev-server热更新 原文https://github.com/zhuangZhou/Blog/issues/3 闲来无事,用koa2撸了一个简易的webpac ...

  9. android v7包的关联

    最近在使用到侧滑栏的时候,使用到了v7包下的actionbar,结果折腾了好久才折腾好,其实很简单的,操作步骤如下: 1. 在eclipse中导入v7包的工程 2. 在自己的工程中打开properti ...

  10. iOS Programming Camera 1

     iOS Programming Camera  1 1 Displaying Images and UIImageView 1.1  put an instance of UIImageView o ...