【BZOJ4034】T2(树链剖分)
题意:
有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个
对于 100% 的数据, N,M<=100000 ,且所有输入数据的绝对值都不
因为以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(树链剖分)的更多相关文章
- [BZOJ4034] [HAOI2015] T2 (树链剖分)
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所 ...
- bzoj4034 (树链剖分+线段树)
Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...
- Bzoj 4034: [HAOI2015]T2 树链剖分,子树问题,dfs序
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1841 Solved: 598[Submit][Status] ...
- BZOJ 4034: [HAOI2015]T2( 树链剖分 )
树链剖分...子树的树链剖分序必定是一段区间 , 先记录一下就好了 ------------------------------------------------------------------ ...
- JZYZOJ1539[haoi2015]T2 树链剖分
http://172.20.6.3/Problem_Show.asp?id=1539 在学校的OJ又写了一次,RE了好多次,原来haoi的时候这道题需要开栈+快读,裸数据结构30分,加上快读50分.o ...
- bzoj 4034 [HAOI2015] T2(树链剖分,线段树)
4034: [HAOI2015]T2 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1536 Solved: 508[Submit][Status] ...
- BZOJ4034 [HAOI2015]树上操作 树链剖分
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4034 题意概括 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三 ...
- BZOJ 4034 [HAOI2015]T2(树链剖分)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4034 [题目大意] 有一棵点数为 N 的树,以点 1 为根,且树点有边权. 有 M 个 ...
- bzoj4034[HAOI2015]树上操作 树链剖分+线段树
4034: [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 6163 Solved: 2025[Submit][Stat ...
- bzoj4034 树上操作 树链剖分+线段树
题目传送门 题目大意: 有一棵点数为 N 的树,以点 1 为根,且树点有权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有 ...
随机推荐
- java 第11次作业:你能看懂就说明你理解了——this关键字
this 代表当前对象
- Some tricks
一 . \(2^i >\sum_{0}^{i - 1}2^i\) 二. 当概率非常小时,且答案允许范围内的误差.如与正确答案不超过\(2^{-6}\)即可. 选取一个较小的值,然后取min即可. ...
- [BZOJ] 1563: [NOI2009]诗人小G
1D/1D的方程,代价函数是一个p次函数,典型的决策单调性 用单调队列(其实算单调栈)维护决策点,优化转移 复杂度\(O(nlogn)\) #include<iostream> #incl ...
- Python爬虫系列-分析Ajax请求并抓取今日头条街拍图片
1.抓取索引页内容 利用requests请求目标站点,得到索引网页HTML代码,返回结果. 2.抓取详情页内容 解析返回结果,得到详情页的链接,并进一步抓取详情页的信息. 3.下载图片与保存数据库 将 ...
- 自动化运维工具——pssh
PSSH介绍 pssh是一个python编写可以在多台服务器上执行命令的工具,同时支持拷贝文件,是同类工具中很出色的.它的用法可以媲美ansible的一些简单用法,执行起来速度比ansible快它支持 ...
- 阿里大鱼短信发送 FOR DT
//增加了参数$action 来标志发送的是什么短信 注册短信 验证码短信 提示短信等 function send_sms($mobile, $message, $word = 0, $time = ...
- 【mysql】【转发】my.cnf 讲解
PS:本配置文件针对Dell R710,双至强E5620.16G内存的硬件配置.CentOS 5.6 64位系统,MySQL 5.5.x 稳定版.适用于日IP 50-100w,PV 100-300w的 ...
- LeetCode(306) Additive Number
题目 Additive number is a string whose digits can form additive sequence. A valid additive sequence sh ...
- 大小端测试C实现
int is_little_endian(void)//判断是否是小端的函数 { union check_fun { int a; char b; }u1; u1.a=;//先将1(实际上就是0x00 ...
- javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)
原博客地址:https://blog.csdn.net/weixin_37766296/article/details/80044000 将多个文件压缩并下载下来:(绿色为修改原博客的位置) 注意:需 ...