Description

You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, 3...N-1. We will ask you to perfrom some instructions of the following form:

CHANGE i ti : change the cost of the i-th edge to ti or

QUERY a b : ask for the maximum edge cost on the path from node a to node b

给一棵共有 n(n · 10000) 个结点的树, 每条边都有一个权值, 要求维护一个数据结构, 支持如下操作:

  1. 修改某条边的权值;
  2. 询问某两个结点之间的唯一通路上的最大边权.

    其中操作的总次数为 q.

Input

The first line of input contains an integer t, the number of test cases (t <= 20). t test cases follow.

For each test case:

In the first line there is an integer N (N <= 10000),

In the next N-1 lines, the i-th line describes the i-th edge: a line with three integers a b c denotes an edge between a, b of cost c (c <= 1000000),

The next lines contain instructions "CHANGE i ti" or "QUERY a b",

The end of each test case is signified by the string "DONE".

There is one blank line between successive tests.

Output

For each "QUERY" operation, write one integer representing its result.

Sample Input

1

3

1 2 1

2 3 2

QUERY 1 2

CHANGE 1 3

QUERY 1 2

DONE

Sample Output

1

3


一道树链剖分的板子题,如果不会的话可以看浅谈算法——树链剖分

稍微需要注意的就是要将边权全部都下放到点权上去,这样的话方便维护

/*program from Wolfycz*/
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
int x=0,f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return x*f;
}
inline void print(int x){
if (x>=10) print(x/10);
putchar(x%10+'0');
}
const int N=1e4;
int dfn[N+10],ID[N+10],V[N+10],line[N+10],n;
struct Segment{
#define ls (p<<1)
#define rs (p<<1|1)
int tree[(N<<2)+10];
void init(){memset(tree,128,sizeof(tree));}
void build(int p,int l,int r){
if (l==r){
tree[p]=V[dfn[l]];
return;
}
int mid=(l+r)>>1;
build(ls,l,mid),build(rs,mid+1,r);
tree[p]=max(tree[ls],tree[rs]);
}
void change(int p,int l,int r,int x,int v){
if (l==r){
tree[p]=v;
return;
}
int mid=(l+r)>>1;
if (x<=mid) change(ls,l,mid,x,v);
else change(rs,mid+1,r,x,v);
tree[p]=max(tree[ls],tree[rs]);
}
int Query(int p,int l,int r,int x,int y){
if (x<=l&&r<=y) return tree[p];
int mid=(l+r)>>1,res=0;
if (x<=mid) res=max(res,Query(ls,l,mid,x,y));
if (y>mid) res=max(res,Query(rs,mid+1,r,x,y));
return res;
}
}Tree;
struct S1{
int pre[(N<<1)+10],now[N+10],child[(N<<1)+10],val[(N<<1)+10],tot,cnt;
int fa[N+10],deep[N+10],top[N+10],size[N+10],Rem[N+10];
void join(int x,int y,int z){pre[++tot]=now[x],now[x]=tot,child[tot]=y,val[tot]=z;}
void insert(int x,int y,int z){join(x,y,z),join(y,x,z);}
void dfs(int x,int Deep){
int T=0; size[x]=1,deep[x]=Deep;
for (int p=now[x],son=child[p];p;p=pre[p],son=child[p]){
if (son==fa[x]) continue;
fa[son]=x,V[son]=val[p],line[(p+1)>>1]=son;
dfs(son,Deep+1);
size[x]+=size[son];
if (T<size[son]) T=size[son],Rem[x]=son;
}
}
void build(int x){
if (!x) return;
top[x]=Rem[fa[x]]==x?top[fa[x]]:x;
dfn[ID[x]=++cnt]=x;
build(Rem[x]);
for (int p=now[x],son=child[p];p;p=pre[p],son=child[p]){
if (son==fa[x]||son==Rem[x]) continue;
build(son);
}
}
int Query(int x,int y){
int res=-inf;
while (top[x]!=top[y]){
if (deep[top[x]]<deep[top[y]]) swap(x,y);
res=max(res,Tree.Query(1,1,n,ID[top[x]],ID[x]));
x=fa[top[x]];
}
if (x==y) return res;
if (deep[x]>deep[y]) swap(x,y);
res=max(res,Tree.Query(1,1,n,ID[Rem[x]],ID[y]));
return res;
}
void init(){
tot=cnt=0;
memset(fa,0,sizeof(fa));
memset(now,0,sizeof(now));
memset(Rem,0,sizeof(Rem));
}
}T;
void init(){
Tree.init();
T.init();
}
char s[10];
int main(){
for (int Data=read();Data;Data--){
init();
n=read();
for (int i=1;i<n;i++){
int x=read(),y=read(),z=read();
T.insert(x,y,z);
}
T.dfs(1,1),T.build(1),Tree.build(1,1,n);
while (true){
scanf("%s",s);
if (s[0]=='D') break;
int x=read(),y=read();
if (s[0]=='Q') printf("%d\n",T.Query(x,y));
if (s[0]=='C') Tree.change(1,1,n,ID[line[x]],y);
}
}
return 0;
}

[SPOJ375]Qtree的更多相关文章

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

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

  2. 树链剖分-SPOJ375(QTREE)

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

  3. SPOJ375.QTREE树链剖分

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

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

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

  5. SPOJ375 QTREE - Query on a tree

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  6. Spoj375 Qtree--树链剖分

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

  7. HDU4010 Query on The Trees(LCT)

    人生的第一道动态树,为了弄懂它的大致原理,需要具备一些前置技能,如Splay树,树链剖分的一些概念.在这里写下一些看各种论文时候的心得,下面的代码是拷贝的CLJ的模板,别人写的模板比较可靠也方便自己学 ...

  8. 【COGS1672】【SPOJ375】QTREE

    这是我的第一个边权链剖 COGS上和SPOJ有点不一样就是没有多组数据了本质还是一样的 我写的是COGS那个事实上改一改就能够去SPOJ AC了= -= (但是我如今上不去SPOJ卧槽(╯‵□′)╯︵ ...

  9. QTREE系列题解

    打了快一星期的qtree终于打完了- - (其实还有两题改不出来弃疗了QAQ) orz神AK一星期前就虐完QTREE 避免忘记还是简单写下题解吧0 0 QTREE1 题意: 给出一颗带边权树 一个操作 ...

随机推荐

  1. ArcGIS Server启动服务报:ERROR: Unable to start Xvfb on any port in the range 6600 - 6619

    http://blog.csdn.net/linghe301/article/details/10094421 今天尝试在Linux环境下安装ArcGIS Server10.2,启动服务碰到一个错误: ...

  2. Fragment实践之聊天窗体

    前几天刚学了android的fragment,总是停留在简单的demo,也许永远都学不会. 今天,我要动手向我的聊天软件开刀.今天.用Fragment来实现一个例如以下图效果的聊天界面. waterm ...

  3. curl -L 跟随跳转

    curl -L 跟随跳转 加上-v 就可以看见详细信息: 学习了:https://www.cnblogs.com/davicelee/archive/2011/11/19/cURL.html http ...

  4. Android从无知到有知——NO.6

    紧随上一篇,说一下创建ip拨号器过程中出现的一些问题. 1)在一開始监听外拨电话的时候会报这样一个警告: Permission Denial: receiving Intent { act=andro ...

  5. hdoj 1203 I NEED A OFFER! 【另类01背包】【概率背包】

    题意:... 策略:动态规划. 由于是求至少能得到一个offer的概率,那我们能够反着求.求得不到一个offer的概率.最后用1减去就好了. 代码: #include<string.h> ...

  6. NHibernate不支持复杂的linq,就一定要用DataTable这么低级吗

    有些linq,好不容易写出来,正想扬眉吐屁一番,不料用NHibernate一执行,却报错,说是不支持,我靠. 只好捏着鼻子写一大段sql,交给它.这种直接执行SQL的情况,我看我同事写的,全部都是返回 ...

  7. Linux常用服务安装部署

    1,centos7默认是装有python的,检查python版本的命令 # 检查python版本 : python -V 2,centOS在安装python3以及tab补全功能 下载python3源码 ...

  8. slf4j的总结

    参考文章 log4j2使用总结 slf4j介绍以及实现原理窥探 使用Slf4j集成Log4j2构建项目日志系统的完美解决方案 slf4j(全称是Simple Loging Facade For Jav ...

  9. 初识NodeJS服务端开发(Express+MySQL)

    http://www.alloyteam.com/2015/03/sexpressmysql/

  10. beego07----web博客

    conf/app.conf appname = blog1 httpport = 8080 runmode = dev name=admin pwd=admin controllersmy/attac ...