4034. [HAOI2015]树上操作【树链剖分】
Description
Input
Output
对于每个询问操作,输出该询问的答案。答案之间用换行隔开。
Sample Input
1 2 3 4 5
1 2
1 4
2 3
2 5
3 3
1 2 1
3 5
2 1 2
3 3
Sample Output
9
13
HINT
对于 100% 的数据, N,M<=100000 ,且所有输入数据的绝对值都不会超过 10^6 。
一道裸的树剖却因为建树时候的sb错误搞了半天
不想说什么(不过这个题好像会炸int)
#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
#define MAXN (100000+50)
using namespace std;
LL Tree[MAXN];
LL T_num[MAXN];
LL Depth[MAXN];
LL Father[MAXN];
LL Sum[MAXN];
LL Son[MAXN];
LL Top[MAXN];
LL a[MAXN];
LL n,m,u,v,sum;
LL head[MAXN],num_edge;
struct node1
{
LL val;
LL add;
} Segt[MAXN*];
struct node2
{
LL to;
LL next;
} edge[MAXN*];
void add(LL u,LL v)
{
edge[++num_edge].to=v;
edge[num_edge].next=head[u];
head[u]=num_edge;
} void Dfs1(LL x)
{
Sum[x]=;
Depth[x]=Depth[Father[x]]+;
for (LL i=head[x]; i!=; i=edge[i].next)
if (edge[i].to!=Father[x])
{
Father[edge[i].to]=x;
Dfs1(edge[i].to);
Sum[x]+=Sum[edge[i].to];
if (Son[x]== || (Sum[Son[x]]<Sum[edge[i].to]))
Son[x]=edge[i].to;
}
} void Dfs2(LL x,LL tp)
{
T_num[x]=++sum;
Tree[sum]=a[x];
Top[x]=tp;
if (Son[x])
Dfs2(Son[x],tp);
for (LL i=head[x]; i!=; i=edge[i].next)
if (edge[i].to!=Son[x] && edge[i].to!=Father[x])
Dfs2(edge[i].to,edge[i].to);
} void Pushdown(LL node,LL l,LL r)
{
if (Segt[node].add!=)
{
LL mid=(l+r)/;
Segt[node*].val+=Segt[node].add*(mid-l+);
Segt[node*+].val+=Segt[node].add*(r-mid);
Segt[node*].add+=Segt[node].add;
Segt[node*+].add+=Segt[node].add;
Segt[node].add=;
}
} void Build(LL node,LL l,LL r)
{
if (l==r)
Segt[node].val=Tree[l];
else
{
LL mid=(l+r)/;
Build(node*,l,mid);
Build(node*+,mid+,r);
Segt[node].val=Segt[node*].val+Segt[node*+].val;
}
} void Update(LL node,LL l,LL r,LL l1,LL r1,LL k)
{
if (l>r1 || r<l1)
return;
if (l1<=l && r<=r1)
{
Segt[node].val+=(r-l+)*k;
Segt[node].add+=k;
return;
}
Pushdown(node,l,r);
LL mid=(l+r)/;
Update(node*,l,mid,l1,r1,k);
Update(node*+,mid+,r,l1,r1,k);
Segt[node].val=Segt[node*].val+Segt[node*+].val;
} LL Query(LL node,LL l,LL r,LL l1,LL r1)
{
if (l>r1 || r<l1)
return ;
if (l1<=l && r<=r1)
return Segt[node].val;
Pushdown(node,l,r);
LL mid=(l+r)/;
return Query(node*,l,mid,l1,r1)+Query(node*+,mid+,r,l1,r1);
} LL Get(LL x)
{
LL ans=;
while (x!=)
{
ans+=Query(,,n,T_num[Top[x]],T_num[x]);
x=Father[Top[x]];
}
return ans;
} int main()
{
scanf("%lld%lld",&n,&m);
for (LL i=; i<=n; ++i)
scanf("%lld",&a[i]);
for (LL i=; i<=n-; ++i)
{
scanf("%lld%lld",&u,&v);
add(u,v);
add(v,u);
}
Dfs1();
Dfs2(,);
Build(,,n);
for (LL i=; i<=m; ++i)
{
LL p,x,y;
scanf("%lld",&p);
if (p==)
{
scanf("%lld%lld",&x,&y);
Update(,,n,T_num[x],T_num[x],y);
}
if (p==)
{
scanf("%lld%lld",&x,&y);
Update(,,n,T_num[x],T_num[x]+Sum[x]-,y);
}
if (p==)
{
scanf("%lld",&x);
printf("%lld\n",Get(x));
}
}
}
4034. [HAOI2015]树上操作【树链剖分】的更多相关文章
- bzoj 4034: [HAOI2015]树上操作 树链剖分+线段树
4034: [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4352 Solved: 1387[Submit][Stat ...
- bzoj 4034: [HAOI2015]树上操作——树链剖分
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...
- BZOJ 4034[HAOI2015]树上操作(树链剖分)
Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点 ...
- bzoj4034[HAOI2015]树上操作 树链剖分+线段树
4034: [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 6163 Solved: 2025[Submit][Stat ...
- 【BZOJ4034】[HAOI2015]树上操作 树链剖分+线段树
[BZOJ4034][HAOI2015]树上操作 Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 ...
- BZOJ4034 [HAOI2015]树上操作 树链剖分
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4034 题意概括 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三 ...
- P3178 [HAOI2015]树上操作 树链剖分
这个题就是一道树链剖分的裸题,但是需要有一个魔性操作___编号数组需要开longlong!!!震惊!真的神奇. 题干: 题目描述 有一棵点数为 N 的树,以点 为根,且树点有边权.然后有 M 个操作, ...
- BZOJ4034[HAOI2015]树上操作——树链剖分+线段树
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都 ...
- bzoj4034 [HAOI2015]树上操作——树链剖分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4034 树剖裸题: 一定要注意 long long !!! update 的时候别忘了 pus ...
- [HAOI2015]树上操作-树链剖分
#include<bits/stdc++.h> using namespace std; const int maxn = 1e6+5; #define mid ((l+r)>> ...
随机推荐
- RegExp正则表达式——更深层次解析
转自:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp RegExp 构造 ...
- Java基础之Object类
类Object是类层次结构的根类.每个类都直接或者间接地继承Object类.所有对象(包括数组)都实现这个类的方法.Object类中的构造方法只有一个,并且是无参构造方法,这说明每个类中默认的无参构造 ...
- oracle序列的创建和使用
oracle 序列的创建与使用 (2012-03-15 16:14:09) -------------------------------------------------------------- ...
- WCF之maxConnections
<bindings> <netTcpBinding> <binding name="TcpBinding" closeTimeout="00 ...
- Java对象的内存(一)
前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...
- [转]XSS的原理分析与解剖:第四章(编码与绕过)
0×01前言 很抱歉,这第四章被我推了几个月,今天是元旦难得有空,就把第四章写下.我先把主要使用的编码说下,介绍完会说下绕过. 本文建议与<杂谈如何绕过WAF>一同阅读. 0×02 URL ...
- asp.net mvc +easyui 实现权限管理(一)
权限是每个企业应用必须的模块,可以简单,也能比较复杂.目前我们公司的权限要求是 能管控页面.字段.按钮.以及数据权限. 正好公司的进销存系统权限模块由我负责.做完后做下记录是个不错的习惯,知识是慢慢积 ...
- android中的textview显示汉字不能自动换行的一个解决办法
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_ ...
- js匹配日期和时间的正则表达式
自己写比较头疼,copy下来留着以后用 //日期的正则表达式 -]\d{}-([-]|[-])-([-]|[-][-]|[-])$/; var regExp = new RegExp(reg); if ...
- Phoenix介绍(持续更新)
现有hbase的查询工具有很多如:Hive,Tez,Impala,Shark/Spark,Phoenix等.今天主要记录Phoenix. phoenix,中文译为“凤凰”,很美的名字.Phoenix是 ...