题意:

有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个

操作,分为三种:
操作 1 :把某个节点 x 的点权增加 a 。
操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a 。
操作 3 :询问某个节点 x 到根的路径中所有点的点权和。

对于 100% 的数据, N,M<=100000 ,且所有输入数据的绝对值都不

会超过 10^6。
 
思路:

因为以X为根中的子树分成了一条条重链,而他们的编号是连续的。

所以我们可以在DFS2时找到以x为根时它的子树在线段树中的最大编号mx[x]。

然后就是裸地区间修改和求和。

 var t:array[..]of record
a,s:int64;
end;
head,vet,next,top,tid,mx,fa,size,a,son,flag,dep,id:array[..]of longint;
n,m,i,x,y,tot,time,ch:longint; procedure add(a,b:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
head[a]:=tot;
end; function max(x,y:longint):longint;
begin
if x>y then exit(x);
exit(y);
end; procedure dfs1(u:longint);
var e,maxsize,v:longint;
begin
flag[u]:=; size[u]:=;
e:=head[u]; son[u]:=; maxsize:=;
while e<> do
begin
v:=vet[e];
if flag[v]= then
begin
fa[v]:=u; dep[v]:=dep[u]+;
dfs1(v);
size[u]:=size[u]+size[v];
if size[v]>maxsize then
begin
maxsize:=size[v];
son[u]:=v;
end;
end;
e:=next[e];
end;
end; procedure dfs2(u,ance:longint);
var e,v:longint;
begin
flag[u]:=; inc(time); tid[u]:=time; id[time]:=u; top[u]:=ance;
mx[u]:=time;
if son[u]> then
begin
dfs2(son[u],ance);
mx[u]:=max(mx[u],mx[son[u]]);
end;
e:=head[u];
while e<> do
begin
v:=vet[e];
if flag[v]= then
begin
dfs2(v,v);
mx[u]:=max(mx[u],mx[v]);
end;
e:=next[e];
end;
end; procedure build(l,r,p:longint);
var mid:longint;
begin
if l=r then
begin
t[p].s:=a[id[l]];
exit;
end;
mid:=(l+r)>>;
build(l,mid,p<<);
build(mid+,r,p<<+);
t[p].s:=t[p<<].s+t[p<<+].s;
end; procedure update(l,r,x,y:longint;v:int64;p:longint);
var mid:longint;
begin
if (l>=x)and(r<=y) then
begin
t[p].a:=t[p].a+v;
t[p].s:=t[p].s+v*(r-l+);
exit;
end;
mid:=(l+r)>>;
t[p<<].a:=t[p<<].a+t[p].a;
t[p<<+].a:=t[p<<+].a+t[p].a;
t[p<<].s:=t[p<<].s+(mid-l+)*t[p].a;
t[p<<+].s:=t[p<<+].s+(r-mid)*t[p].a;
t[p].a:=;
if x<=mid then update(l,mid,x,y,v,p<<);
if y>mid then update(mid+,r,x,y,v,p<<+);
t[p].s:=t[p<<].s+t[p<<+].s;
end; function query(l,r,x,y,p:longint):int64;
var mid:longint;
tt:int64;
begin
if (l>=x)and(r<=y) then exit(t[p].s);
mid:=(l+r)>>;
t[p<<].a:=t[p<<].a+t[p].a;
t[p<<+].a:=t[p<<+].a+t[p].a;
t[p<<].s:=t[p<<].s+(mid-l+)*t[p].a;
t[p<<+].s:=t[p<<+].s+(r-mid)*t[p].a;
t[p].a:=;
tt:=;
if x<=mid then tt:=tt+query(l,mid,x,y,p<<);
if y>mid then tt:=tt+query(mid+,r,x,y,p<<+);
exit(tt);
end; function ask(x:longint):int64;
var t:int64;
begin
t:=;
while top[x]<> do
begin
t:=t+query(,n,tid[top[x]],tid[x],);
x:=fa[top[x]];
end;
t:=t+query(,n,,tid[x],);
exit(t);
end; begin
assign(input,'bzoj4034.in'); reset(input);
assign(output,'bzoj4034.out'); rewrite(output);
readln(n,m);
for i:= to n do read(a[i]);
for i:= to n- do
begin
readln(x,y);
add(x,y);
add(y,x);
end;
dfs1();
fillchar(flag,sizeof(flag),);
dfs2(,);
build(,n,); for i:= to m do
begin
read(ch);
case ch of
:
begin
read(x,y);
update(,n,tid[x],tid[x],y,);
end;
:
begin
read(x,y);
update(,n,tid[x],mx[x],y,);
end;
:
begin
read(x);
writeln(ask(x));
end;
end;
end;
close(input);
close(output);
end.
 

【BZOJ4034】T2(树链剖分)的更多相关文章

  1. [BZOJ4034] [HAOI2015] T2 (树链剖分)

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所 ...

  2. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  3. Bzoj 4034: [HAOI2015]T2 树链剖分,子树问题,dfs序

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1841  Solved: 598[Submit][Status] ...

  4. BZOJ 4034: [HAOI2015]T2( 树链剖分 )

    树链剖分...子树的树链剖分序必定是一段区间 , 先记录一下就好了 ------------------------------------------------------------------ ...

  5. JZYZOJ1539[haoi2015]T2 树链剖分

    http://172.20.6.3/Problem_Show.asp?id=1539 在学校的OJ又写了一次,RE了好多次,原来haoi的时候这道题需要开栈+快读,裸数据结构30分,加上快读50分.o ...

  6. bzoj 4034 [HAOI2015] T2(树链剖分,线段树)

    4034: [HAOI2015]T2 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1536  Solved: 508[Submit][Status] ...

  7. BZOJ4034 [HAOI2015]树上操作 树链剖分

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4034 题意概括 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三 ...

  8. BZOJ 4034 [HAOI2015]T2(树链剖分)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4034 [题目大意] 有一棵点数为 N 的树,以点 1 为根,且树点有边权. 有 M 个 ...

  9. bzoj4034[HAOI2015]树上操作 树链剖分+线段树

    4034: [HAOI2015]树上操作 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 6163  Solved: 2025[Submit][Stat ...

  10. bzoj4034 树上操作 树链剖分+线段树

    题目传送门 题目大意: 有一棵点数为 N 的树,以点 1 为根,且树点有权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有 ...

随机推荐

  1. Linux学习日记:第二天

    今天学习vi编辑命令: root@ubuntu:vi hello.java 使用到的命令: 插入命令: a 和 i:在当前光标前或后插入文本(A 和 I 分别在当前行行末或行首插入文本):  o 和  ...

  2. 读取Exchange的用户未读邮件数的几种方法

    [http://www.cnblogs.com/nbpowerboy/p/3539422.html] 可以使用ExchangeServiceBinding获取邮件,他相当于outlook, 来获取服务 ...

  3. iOS开发之MVVM在项目中的应用

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  4. 【Python项目实战】Pandas:让你像写SQL一样做数据分析(一)

    1. 引言 Pandas是一个开源的Python数据分析库.Pandas把结构化数据分为了三类: Series,1维序列,可视作为没有column名的.只有一个column的DataFrame: Da ...

  5. Voyager的路由

    修改默认的后台登录路由 打开web.php,把prefix值改为你想设置的值,如back: Route::group(['prefix' => 'back'], function () { Vo ...

  6. python——全局变量&局部变量

    >>> count = 5 >>> def function(): count = 10 print(10) >>> function() 10 ...

  7. k短路模板

    https://acm.taifua.com/archives/jsk31445.html 链接: https://nanti.jisuanke.com/t/31445 #include <io ...

  8. 奇数结点升序偶数结点降序的单链表排序(Python实现)

    题目 一个链表,奇数结点升序,偶数结点降序,要求变成一个全升序的链表. 例如:1->8->2->7->3->6->4->5,变为1->2->3-& ...

  9. Linux学习-使用传统程序语言进行编译的简单范例

    单一程序:印出 HelloWorld 编辑程序代码,亦即原始码 [root@study ~]# vim hello.c <==用 C 语言写的程序扩展名建议用 .c #include <s ...

  10. Python 综合应用小项目一

    数据库报错重连机制 利用异常捕获来获取mysql断开的报错,然后再重连 import MySQLdb as mysql class DB: def __init__(self,host,user,pa ...