题目描述 Description

一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。

我们将以下面的形式来要求你对这棵树完成一些操作:

  1. I.                    CHANGE u t : 把结点u的权值改为t
  2. II.                 QMAX u v: 询问从点u到点v的路径上的节点的最大权值
  3. III.               QSUM u v: 询问从点u到点v的路径上的节点的权值和

 

注意:从点u到点v的路径上的节点包括u和v本身

输入描述 Input Description

输入文件的第一行为一个整数n,表示节点的个数。

接下来n – 1行,每行2个整数a和b,表示节点a和节点b之间有一条边相连。

       接下来n行,每行一个整数,第i行的整数wi表示节点i的权值。

接下来1行,为一个整数q,表示操作的总数。

接下来q行,每行一个操作,以“CHANGE u t”或者“QMAX u v”或者“QSUM u v”的形式给出。

输出描述 Output Description

对于每个“QMAX”或者“QSUM”的操作,每行输出一个整数表示要求输出的结果。

样例输入 Sample Input

4

1 2

2 3

4 1

4 2 1 3

12

QMAX 3 4

QMAX 3 3

QMAX 3 2

QMAX 2 3

QSUM 3 4

QSUM 2 1

CHANGE 1 5

QMAX 3 4

CHANGE 3 6

QMAX 3 4

QMAX 2 4

QSUM 3 4

样例输出 Sample Output

4

1

2

2

10

6

5

6

5

16

数据范围及提示 Data Size & Hint

对于100%的数据,保证1<=n<=30000,0<=q<=200000;中途操作中保证每个节点的权值w在-30000到30000之间。

分类标签 Tags 点此展开

思路:树链剖分搞一下就好。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 30010
using namespace std;
int n,q,sz,tot;
int w[MAXN];
int top[MAXN],id[MAXN];
int to[MAXN*],net[MAXN*],head[MAXN];
int dad[MAXN],size[MAXN],deep[MAXN];
struct nond{
int l,r,max,sum;
}tree[MAXN*];
void add(int u,int v){
to[++tot]=v;net[tot]=head[u];head[u]=tot;
to[++tot]=u;net[tot]=head[v];head[v]=tot;
}
void up(int now){
tree[now].sum=tree[now*].sum+tree[now*+].sum;
tree[now].max=max(tree[now*].max,tree[now*+].max);
}
void build(int now,int l,int r){
tree[now].l=l;tree[now].r=r;
if(tree[now].l==tree[now].r) return ;
int mid=(tree[now].l+tree[now].r)/;
build(now*,l,mid);
build(now*+,mid+,r);
up(now);
}
void change(int now,int pos,int x){
if(tree[now].l==tree[now].r){
tree[now].max=x;tree[now].sum=x;
return ;
}
int mid=(tree[now].l+tree[now].r)/;
if(pos<=mid) change(now*,pos,x);
else if(pos>mid) change(now*+,pos,x);
up(now);
}
int query(int now,int l,int r,int k){
if(tree[now].l==l&&tree[now].r==r){
if(k==) return tree[now].max;
else if(k==) return tree[now].sum;
}
int mid=(tree[now].l+tree[now].r)/;
if(r<=mid) return query(now*,l,r,k);
else if(l>mid) return query(now*+,l,r,k);
else{
if(k==) return max(query(now*,l,mid,k),query(now*+,mid+,r,k));
else if(k==) return query(now*,l,mid,k)+query(now*+,mid+,r,k);
}
}
void dfs(int now){
size[now]=;
deep[now]=deep[dad[now]]+;
for(int i=head[now];i;i=net[i])
if(dad[now]!=to[i]){
dad[to[i]]=now;
dfs(to[i]);
size[now]+=size[to[i]];
}
}
void dfs1(int x){
int t=;id[x]=++sz;
if(!top[x]) top[x]=x;
change(,id[x],w[x]);
for(int i=head[x];i;i=net[i])
if(dad[x]!=to[i]&&size[to[i]]>size[t])
t=to[i];
if(t){
top[t]=top[x];
dfs1(t);
}
for(int i=head[x];i;i=net[i])
if(dad[x]!=to[i]&&t!=to[i])
dfs1(to[i]);
}
int squery(int x,int y,int pos){
int ans;
if(pos==) ans=;
else if(pos==) ans=-0x7f7f7f7f;
for(;top[x]!=top[y];){
if(deep[top[x]]<deep[top[y]]) swap(x,y);
if(pos==) ans+=query(,id[top[x]],id[x],pos);
else if(pos==) ans=max(ans,query(,id[top[x]],id[x],pos));
x=dad[top[x]];
}
if(id[x]>id[y]) swap(x,y);
if(pos==) ans+=query(,id[x],id[y],pos);
else if(pos==) ans=max(ans,query(,id[x],id[y],pos));
return ans;
}
int main(){
scanf("%d",&n);
for(int i=;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
for(int i=;i<=n;i++) scanf("%d",&w[i]);
build(,,n);
dfs();
dfs1();
scanf("%d",&q);
for(int i=;i<=q;i++){
char c[];int u,v;
cin>>c;scanf("%d%d",&u,&v);
if(c[]=='C') change(,id[u],v);
else if(c[]=='Q'&&c[]=='M') printf("%d\n",squery(u,v,));
else printf("%d\n",squery(u,v,));
}
}

codevs 2460 树的统计的更多相关文章

  1. 2008ZJOI树的统计

    codevs 2460 树的统计 http://codevs.cn/problem/2460/ 2008年省队选拔赛浙江  题目等级 : 大师 Master   题目描述 Description 一棵 ...

  2. Codevs 2460 == BZOJ 1036 树的统计

     2460 树的统计 2008年省队选拔赛浙江 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 一棵树上有n个节点,编号分别为1 ...

  3. C++之路进阶——codevs2460(树的统计)

    2460 树的统计 2008年省队选拔赛浙江  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 大师 Master       题目描述 Description 一棵树上有n个节 ...

  4. BZOJ 1036: [ZJOI2008]树的统计Count [树链剖分]【学习笔记】

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 14302  Solved: 5779[Submit ...

  5. bzoj1036 [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 12646  Solved: 5085 [Subm ...

  6. BZOJ 1036: [ZJOI2008]树的统计Count

    1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 14354  Solved: 5802 [Subm ...

  7. 【BZOJ1036】[ZJOI2008]树的统计Count 树链剖分

    [BZOJ1036][ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. ...

  8. BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)

    潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...

  9. BZOJ 1036 树的统计-树链剖分

    [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...

随机推荐

  1. C# 操作 INI 自己工作笔记(对文本框的操作)

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  2. JAVA8与lambda表达式

    一.lambda表达式的来源 Lambda 表达式(拉姆达表达式)来源于lambda演算是Alonzo Church给出的一套图灵机等价的形式计算系统.lambda演算系统以函数和变量为基础,也可以进 ...

  3. 82.角色管理Extjs 页面

    1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8&quo ...

  4. Java IO流文件复制/解压的几种方法总结

    引言 在JavaWeb项目开发过程,涉及到IO文件的读写操作以及文件的复制copy操作是作为一个程序员不可获取的知识,那接下来就总结一些copy文件的一些方法,与大家通过学习,如果还有其他更好的方法, ...

  5. spark作业运行过程之--DAGScheduler

    DAGScheduler--stage划分和创建以及stage的提交 本篇,我会从一次spark作业的运行为切入点,将spark运行过程中涉及到的各个步骤,包括DAG图的划分,任务集的创建,资源分配, ...

  6. mac下idea卡顿问题解决

    idea在加载相对来说比较大的系统时,经常性出现卡顿,就是直接卡死,以至于写起代码特别难受. 最后找到的解决方案是修改idea.vmoptions中的内存大小 执行 find / -name idea ...

  7. Spring Cloud (3) 服务消费者-Ribbon

    在上一篇中使用LoadBalancerClient接口实现了获取某个服务的具体实例,并根据实例信息发起服务接口消费请求.但是这样的做法需要我们手工的区编写服务选取.连接拼接等繁琐的工作,对于开发人员来 ...

  8. Super超级ERP系统---(9)订单管理--订单拣货

    订单审核完成后,库房就可以开始备货,安排相应的人员去拣货了.订单拣货主要分为一次分拣和二次分拣,这里我们先看下一次分拣的流程.一次分拣就是根据订单去拣货,可以简单的理解为拿着一个订单,推着购物车,把当 ...

  9. Struts2 在拦截器中向Action传参

    struts.xml配置文件: <package name="system-default" extends="struts-default" abstr ...

  10. Android 解决小米手机Android Studio安装app 报错的问题It is possible that this issue is resolved by uninstalling an existi

    Android Studio升级到2.3版本之后,小米手机MIUI8不能运行Android Studio程序,报如下错误: Installation failed with message Faile ...