Description

一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身
Input

输入的第一行为一个整数n,表示节点的个数。接下来n – 1行,每行2个整数a和b,表示节点a和节点b之间有一条边相连。接下来n行,每行一个整数,第i行的整数wi表示节点i的权值。接下来1行,为一个整数q,表示操作的总数。接下来q行,每行一个操作,以“CHANGE u t”或者“QMAX u v”或者“QSUM u v”的形式给出。 对于100%的数据,保证1<=n<=30000,0<=q<=200000;中途操作中保证每个节点的权值w在-30000到30000之间。
Output

对于每个“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

裸树链剖分,我就不多说了,附入门教程

 const
maxn=;
type
node=record
son:array[..]of longint;
sum,max,left,right,mid:longint;
end;
var
n,m,num,tot,xx,ll,rr,goal:longint;
tree:array[..maxn*]of node;
first,fa,dep,son,size,w,top,root:array[..maxn]of longint;
next,last:array[..maxn*]of longint; procedure insert(x,y:longint);
begin
inc(num);
last[num]:=y;
next[num]:=first[x];
first[x]:=num;
end; procedure dfs1(x,d,f:longint);
var
i:longint;
begin
dep[x]:=d;
fa[x]:=f;
size[x]:=;
i:=first[x];
while i<> do
begin
if last[i]<>f then
begin
dfs1(last[i],d+,x);
if size[last[i]]>size[son[x]] then son[x]:=last[i];
inc(size[x],size[last[i]]);
end;
i:=next[i];
end;
end; procedure build(l,r:longint);
var
now:longint;
begin
inc(tot);
now:=tot;
with tree[now] do
begin
left:=l;
right:=r;
if l=r then exit;
mid:=(l+r)>>;
son[]:=tot+;
build(l,mid);
son[]:=tot+;
build(mid+,r);
end;
end; procedure dfs2(x,t,ww:longint);
var
i:longint;
begin
w[x]:=ww;
top[x]:=t;
if son[x]= then
begin
root[x]:=tot+;
build(,ww);
exit;
end
else
begin
dfs2(son[x],t,ww+);
root[x]:=root[son[x]];
end;
i:=first[x];
while i<> do
begin
if (last[i]<>fa[x]) and (last[i]<>son[x]) then dfs2(last[i],last[i],);
i:=next[i];
end;
end; procedure change(now:longint);
begin
with tree[now] do
begin
if left=right then
begin
sum:=goal;
max:=goal;
exit;
end;
if xx<=mid then change(son[])
else change(son[]);
if tree[son[]].max>tree[son[]].max then max:=tree[son[]].max
else max:=tree[son[]].max;
sum:=tree[son[]].sum+tree[son[]].sum;
end;
end; function getsum(now:longint):longint;
begin
with tree[now] do
begin
if (ll<=left) and (rr>=right) then exit(sum);
if rr<=mid then exit(getsum(son[]));
if ll>mid then exit(getsum(son[]));
exit(getsum(son[])+getsum(son[]));
end;
end; function getmax(now:longint):longint;
var
s:longint;
begin
with tree[now] do
begin
if (ll<=left) and (rr>=right) then exit(max);
if rr<=mid then exit(getmax(son[]));
if ll>mid then exit(getmax(son[]));
getmax:=getmax(son[]);
s:=getmax(son[]);
if s>getmax then getmax:=s;
end;
end; procedure init;
var
i,x,y:longint;
begin
read(n);
for i:= to n- do
begin
read(x,y);
insert(x,y);
insert(y,x);
end;
dfs1(,,);
dfs2(,,);
for i:= to n do
begin
read(goal);
xx:=w[i];
change(root[i]);
end;
end; procedure work;
var
i,ans,s,x,y:longint;
s1,s2:char;
begin
read(m);
for i:= to m do
begin
read(s2);
while s2<>' ' do
begin
s1:=s2;
read(s2);
end;
read(x,y);
case s1 of
'E':begin
goal:=y;
xx:=w[x];
change(root[x]);
end;
'X':begin
ans:=-;
while top[x]<>top[y] do
begin
if dep[top[x]]<dep[top[y]] then
begin
s:=x;x:=y;y:=s;
end;
ll:=;
rr:=w[x];
s:=getmax(root[x]);
if s>ans then ans:=s;
x:=fa[top[x]];
end;
if dep[x]<dep[y] then
begin
s:=x;x:=y;y:=s;
end;
ll:=w[y];
rr:=w[x];
s:=getmax(root[x]);
if s>ans then ans:=s;
writeln(ans);
end;
'M':begin
ans:=;
while top[x]<>top[y] do
begin
if dep[top[x]]<dep[top[y]] then
begin
s:=x;x:=y;y:=s;
end;
ll:=;
rr:=w[x];
inc(ans,getsum(root[x]));
x:=fa[top[x]];
end;
if dep[x]<dep[y] then
begin
s:=x;x:=y;y:=s;
end;
ll:=w[y];
rr:=w[x];
inc(ans,getsum(root[x]));
writeln(ans);
end;
end;
end;
end; begin
init;
work;
end.

1036: [ZJOI2008]树的统计Count - BZOJ的更多相关文章

  1. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

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

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

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

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

  4. bzoj 1036 [ZJOI2008]树的统计Count(树链剖分,线段树)

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

  5. Bzoj 1036: [ZJOI2008]树的统计Count 树链剖分,LCT

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

  6. 数据结构(LCT动态树):BZOJ 1036: [ZJOI2008]树的统计Count

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

  7. BZOJ 1036: [ZJOI2008]树的统计Count( 树链剖分 )

    树链剖分... 不知道为什么跑这么慢 = = 调了一节课啊跪.. ------------------------------------------------------------------- ...

  8. bzoj 1036: [ZJOI2008]树的统计Count 树链剖分+线段树

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

  9. bzoj 1036: [ZJOI2008]树的统计Count (树链剖分+线段树 点权)

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

随机推荐

  1. this及其作用域(函数外部this变量的调用)

    众所周知的一件麻烦事是函数外部的this变量都不可见,但是我们在编写使用局部函数的方法时,却又很可能需要在某一时刻从内部函数访问this变量. 这种情况下可以通过在this变量中存储一个需要的信息(例 ...

  2. Linux 命令 - wget: 非交互式网络下载器

    命令格式 wget [option]... [URL]... 命令参数 启动选项 -V, --version 打印版本信息 -h, --help 打印帮助信息 日志和输入文件选项 -o logfile ...

  3. ASP.NET网站前端页面的复制

    网络普及的时代,遇到问题的首要解决方案并不是问人,而是找度娘.当我们找一些技术性的问题时,会发现很多解决方案在博客里,看看博主发表的博客总是惊叹不已,想要自己也有这么一个好习惯,把学到的东西以自己的方 ...

  4. 需要MARK一下,奇怪的ANDROID SDK自带的APK加密功能的问题

    花了两天时间,各种调试APP,发现问题不在于代码. 在于用了SDK里的加密,导致运行其中一个多线程中的ACTIVITY, 就会黑屏,返回按钮也没用. 发现这个问题的思路是因为,我发现连手机直接调试,一 ...

  5. 第二十九篇、UICollectionView瀑布流

    1.实现思路 >第一种方案:UIScrollView 镶嵌三个UITableView (不推荐使用) >第二种方案:UIScrollView 镶嵌UIImageView (需要解决循环利用 ...

  6. C#编写以管理员身份运行的程序

    using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; names ...

  7. NodeJS缓存机制:畅销货,就多囤一点呗

    上一篇文章,我们已经实现了客户端向NodeJS服务器发出请求时,服务器从磁盘读取文件内容后,向客户端返回文件的数据.而对于爱莲(iLinkIT)的1对n的场景,即将文件共享出来之后,让多个用户同时下载 ...

  8. 关键字 virtual

    Virtual是C++ OO机制中很重要的一个关键字.只要是学过C++的人都知道在类Base中加了Virtual关键字的函数就是虚拟函数(例如函数print),于是在Base的派生类Derived中就 ...

  9. vs2008+qt进行开发

    第一次接触qt vs,完全小白,网上找资料,各种乱,还大部分是很早以前的,挣扎了好几天终于搞定了, 在此给大家分享. 首先是下载vs2008 (我的项目组项目要求用这个版本),这个比较容易下载:然后是 ...

  10. [转载]mysql慢日志文件分析处理

    原文地址:mysql慢日志文件分析处理作者:maxyicha mysql有一个功能就是可以log下来运行的比较慢的sql语句,默认是没有这个log的,为了开启这个功能,要修改my.cnf或者在mysq ...