ZJ2008树的统计(树链剖分)
type node1=record
go,next:longint;end;
node2=record
l,r,mx,sum:longint;end;
var i,x,y,n,q,tmp,cnt,sz,code:longint;
ch,st:string;
fa:array[..,..] of longint;
v,deep,son,head,pl,belong,vis:array[..] of longint;
e:array[..] of node1;
t:array[..] of node2;
procedure insert(x,y:longint);
begin
inc(cnt);e[cnt].go:=y;e[cnt].next:=head[x];head[x]:=cnt;
inc(cnt);e[cnt].go:=x;e[cnt].next:=head[y];head[y]:=cnt;
end;
procedure dfs1(x:longint);
var i,j:longint;
begin
son[x]:=;vis[x]:=;
for i:= to do
begin
if deep[x]<(<<i) then break;
fa[x,i]:=fa[fa[x,i-],i-];
end;
i:=head[x];
while i<> do
begin
j:=e[i].go;
if vis[j]= then
begin
deep[j]:=deep[x]+;
fa[j,]:=x;
dfs1(j);
inc(son[x],son[j]);
end;
i:=e[i].next;
end;
end;
procedure dfs2(x,chain:longint);
var i,j,k:longint;
begin
k:=;inc(sz);
pl[x]:=sz;belong[x]:=chain;
i:=head[x];
while i<> do
begin
j:=e[i].go;
if (deep[j]>deep[x]) and (son[j]>son[k]) then k:=j;
i:=e[i].next;
end;
if k= then exit;
dfs2(k,chain);
i:=head[x];
while i<> do
begin
j:=e[i].go;
if (deep[j]>deep[x]) and (k<>j) then
dfs2(j,j);
i:=e[i].next;
end;
end;
function lca(x,y:longint):longint;
var i,tmp:longint;
begin
if deep[x]<deep[y] then begin tmp:=x;x:=y;y:=tmp;end;
tmp:=deep[x]-deep[y];
for i:= to do
if (tmp and (<<i)<>) then x:=fa[x,i];
for i:= downto do
if fa[x,i]<>fa[y,i] then
begin
x:=fa[x,i];y:=fa[y,i];
end;
if x=y then exit(x) else exit(fa[x,]);
end;
procedure build(x,y,k:longint);
var mid:longint;
begin
with t[k] do
begin
l:=x;r:=y;
if l=r then exit;
mid:=(l+r)>>;
build(l,mid,k<<);
build(mid+,r,k<<+);
end;
end;
function max(x,y:longint):longint;
begin
if x>y then exit(x) else exit(y);
end;
procedure change(x,y,k:longint);
var mid:longint;
begin
with t[k] do
begin
if l=r then
begin sum:=y;mx:=y;exit;end;
mid:=(l+r)>>;
if x<=mid then change(x,y,k<<)
else change(x,y,k<<+);
sum:=t[k<<].sum+t[k<<+].sum;
mx:=max(t[k<<].mx,t[k<<+].mx);
end;
end;
function getsum(x,y,k:longint):longint;
var mid:longint;
begin
with t[k] do
begin
if (l=x) and (r=y) then exit(sum);
mid:=(l+r)>>;
if x>mid then exit(getsum(x,y,k<<+))
else if y<=mid then exit((getsum(x,y,k<<)))
else exit(getsum(x,mid,k<<)+getsum(mid+,y,k<<+));
end;
end;
function getmx(x,y,k:longint):longint;
var mid:longint;
begin
with t[k] do
begin
if (l=x) and (r=y) then exit(mx);
mid:=(l+r)>>;
if x>mid then exit(getmx(x,y,k<<+))
else if y<=mid then exit(getmx(x,y,k<<))
else exit(max(getmx(x,mid,k<<),getmx(mid+,y,k<<+)));
end;
end;
function solvesum(x,y:longint):longint;
var sum:longint;
begin
sum:=;
while belong[x]<>belong[y] do
begin
inc(sum,getsum(pl[belong[x]],pl[x],));
x:=fa[belong[x],];
end;
inc(sum,getsum(pl[y],pl[x],));
exit(sum);
end;
function solvemx(x,y:longint):longint;
var mx:longint;
begin
mx:=-maxlongint;
while belong[x]<>belong[y] do
begin
mx:=max(mx,getmx(pl[belong[x]],pl[x],));
x:=fa[belong[x],];
end;
mx:=max(mx,getmx(pl[y],pl[x],));
exit(mx);
end;
procedure init;
begin
readln(n);
for i:= to n- do
begin
readln(x,y);insert(x,y);
end;
for i:= to n do read(v[i]);
end;
procedure solve;
begin
build(,n,);
for i:= to n do change(pl[i],v[i],);
readln(q);
for i:= to q do
begin
readln(st);
ch:=copy(st,,pos(' ',st)-);
delete(st,,pos(' ',st));
val(copy(st,,pos(' ',st)-),x,code);
delete(st,,pos(' ',st));
val(st,y,code);
case ch of
'CHANGE':begin
v[x]:=y;
change(pl[x],y,);
end;
'QMAX':begin
tmp:=lca(x,y);
writeln(max(solvemx(x,tmp),solvemx(y,tmp)));
end;
else begin
tmp:=lca(x,y);
writeln(solvesum(x,tmp)+solvesum(y,tmp)-v[tmp]);
end;
end;
end;
end;
begin
init;
dfs1();
dfs2(,);
solve;
end.
作为以后的模版!
ZJ2008树的统计(树链剖分)的更多相关文章
- BZOJ 1036: [ZJOI2008]树的统计Count-树链剖分(点权)(单点更新、路径节点最值、路径求和)模板,超级认真写了注释啊啊啊
1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 23015 Solved: 9336[Submit ...
- 树的统计Count---树链剖分
NEFU专项训练十和十一——树链剖分 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t ...
- BZOJ 1036 树的统计-树链剖分
[ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 12904 Solved: 5191[Submit][Status ...
- bzoj1036 树的统计 树链剖分模板
题意:给出树上任意两点,求路径上的值的和与最大值,带单点修改操作 树链剖分思路: 1.对树进行dfs求出点的深度和父亲节点,然后求出轻重儿子(重儿子就是点最多的那个子树,其余都是轻儿子),用一个son ...
- zjoi 2008 树的统计——树链剖分
比较基础的一道树链剖分的题 大概还是得说说思路 树链剖分是将树剖成很多条链,比较常见的剖法是按儿子的size来剖分,剖分完后对于这课树的询问用线段树维护——比如求路径和的话——随着他们各自的链向上走, ...
- BZOJ-1036 树的统计Count 链剖线段树(模板)=(树链剖分+线段树)
潇爷昨天刚刚讲完...感觉得还可以...对着模板打了个模板...还是不喜欢用指针.... 1036: [ZJOI2008]树的统计Count Time Limit: 10 Sec Memory Lim ...
- BZOJ1036[ZJOI2008]树的统计——树链剖分+线段树
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v ...
- [ZJOI2008]树的统计——树链剖分
本题是一个树链剖分裸题,由于比较菜,老是RE,后来发现是因为使用了全局变量. /************************************************************ ...
- [luogu P2590 ZJOI2008] 树的统计 (树链剖分)
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...
- 洛谷P2590 [ZJOI2008] 树的统计 [树链剖分]
题目传送门 树的统计 题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t ...
随机推荐
- NOI2014 全国互测Round2
数据包:http://pan.baidu.com/s/1pJNSkL9 T1: 我们先直接用矩阵快速幂暴力 首先是0维,f1=1,f2=1 然后推出下一维的f1'和f2' 下一维的f1'和f2'其实就 ...
- BZOJ 4302 Buildings 解题报告
这个题好像很有趣的样子. 题目分析: 房间都是 $1\times k$ 的,也就是一条一条的.这个好像比较显然的样子. 一个房间如果要覆盖某个格子$u$,那么这个房间的面积至少为 $dis(u, Bo ...
- Matlab中min/max函数的误解
1.C= min(a):返回最小值:我原来以为如果a是行向量,min(a)返回a本身,因为我记得min(a,1)是按列找最小,这是默认的.doc min发现,只要a是向量,那么返回最小值. 2.C= ...
- 剑指offer--面试题16
#include<stack> //思路:遍历链表过程中,将各个指针入栈,再出栈进行反转 ListNode* ReverseList(ListNode* pHead) { if(pHead ...
- JavaScript高级---组合模式设计
一.设计模式 javascript里面给我们提供了很多种设计模式: 工厂.桥.组合.门面.适配器.装饰者.享元.代理.观察者.命令.责任链 在前面我们实现了工厂模式和桥模式 工厂模式 : 核心:为了生 ...
- 【设计模式六大原则6】开闭原则(Open Close Principle)
定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 问题由来:在软件的生命周期内,因为变化.升级和维护等原因需要对软件原有代码进行修改时,可能会给旧代码中引入错误,也可能会使我们不得不 ...
- POJ 2106 Boolean Expressions (布尔表达式求值)
题意:关于!,&,| 的运算,表达式中V代表true,F代表false. 思路:见代码吧,很详细了. 要注意 !!!F,!(...) 的情况. #include <iostream> ...
- hdu 4497 GCD and LCM
思路:易知L不能整除G时为0: 将L/G质因数分解,对于其中的因子p,个数为cnt,则至少有一个包含p^cnt,至少有一个数不包含p: 只有一个数包含p^cnt时,有C(3,1); 有2个数包含p^c ...
- [优先队列]HDOJ5360 Hiking
题意:有n个人,每个人有两个参数$l$和$r$ 邀请他们去hiking, 当 当前已经邀请到的人数大于等于$l$,并且小于等于$r$,那么这个人就会去 问最多能邀请到几个人 并输出 依次要邀请的人的 ...
- POSIX semaphore: sem_open, sem_close, sem_post, sem_wait
http://www.cnblogs.com/BloodAndBone/archive/2011/01/18/1938552.html 一.Posix有名信号灯 1.posix有名信号灯函数 函数se ...