一个很裸的树链剖分模板。注意一下数据范围,有的地方要开longlong,这就是唯一的陷阱了。

# include<iostream>
# include<cstdio>
# include<cmath>
# include<algorithm>
using std::max;
using std::min;
const int mn = 100005;
typedef long long LL;
struct edge{int to,next;};
edge e[mn*2];
int edge_max,head[mn];
void add(int x,int y)
{
e[++edge_max].to=y;
e[edge_max].next=head[x];
head[x]=edge_max;
}
int n,m;
int val[mn];
int fa[mn],siz[mn];
void dfs1(int x)
{
siz[x]=1;
for(int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(v==fa[x])
continue;
fa[v]=x;
dfs1(v);
siz[x]+=siz[v];
}
}
int tot,id[mn],bl[mn],mx[mn];
void dfs2(int x,int chain)
{
int k=0;
++tot;
id[x]=mx[x]=tot;
bl[x]=chain;
for(int i=head[x];i;i=e[i].next)
{
if(e[i].to!=fa[x] && siz[e[i].to]>siz[k])
k=e[i].to;
}
if(k==0)
return ;
dfs2(k,chain);
mx[x]=max(mx[x],mx[k]);
for(int i=head[x];i;i=e[i].next)
{
if(fa[x]!=e[i].to && e[i].to!=k)
{
dfs2(e[i].to,e[i].to);
mx[x]=max(mx[x],mx[e[i].to]);
}
}
}
struct node{int l,r;LL sum,tag;};
node tr[mn*4];
inline void pushdown(int cur)
{
if(tr[cur].tag && tr[cur].l!=tr[cur].r)
{
tr[cur<<1].tag+=tr[cur].tag;
tr[cur<<1|1].tag+=tr[cur].tag;
tr[cur<<1].sum+=(tr[cur<<1].r-tr[cur<<1].l+1)*tr[cur].tag;
tr[cur<<1|1].sum+=(tr[cur<<1|1].r-tr[cur<<1|1].l+1)*tr[cur].tag;
tr[cur].tag=0;
}
}
void build(int l,int r,int cur)
{
tr[cur].l=l,tr[cur].r=r;
if(l==r)
{
return ;
}
int mid=l+r>>1;
build(l,mid,cur<<1);
build(mid+1,r,cur<<1|1);
}
void update(int cur,int l,int r,LL x)//此处要开longlong防止下面爆掉
{
if(tr[cur].r<l || tr[cur].l>r)
return ;
pushdown(cur);
if(tr[cur].l>=l && tr[cur].r<=r)
{
tr[cur].sum+=(tr[cur].r-tr[cur].l+1)*x;//就是这里容易爆掉
tr[cur].tag+=x;
return ;
}
update(cur<<1,l,r,x);
update(cur<<1|1,l,r,x);
tr[cur].sum=tr[cur<<1].sum+tr[cur<<1|1].sum;
}
LL qsum(int cur,int l,int r)
{
if(tr[cur].r<l || tr[cur].l>r)
return 0;
pushdown(cur);
if(tr[cur].l>=l && tr[cur].r<=r)
return tr[cur].sum;
LL tmp=0;
tmp+=qsum(cur<<1,l,r);
tmp+=qsum(cur<<1|1,l,r);
tr[cur].sum=tr[cur<<1].sum+tr[cur<<1|1].sum;
return tmp;
}
void querry(int x)
{
LL ans=0;
while(bl[x]!=1)
{
ans+=qsum(1,id[bl[x]],id[x]);
x=fa[bl[x]];
}
ans+=qsum(1,1,id[x]);
printf("%lld\n",ans);
}
int main()
{
int opt,x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&val[i]);
for(int i=1;i<n;i++)
{
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
dfs1(1);
dfs2(1,1);
build(1,n,1);
for(int i=1;i<=n;i++)
update(1,id[i],id[i],val[i]);
for(int i=1;i<=m;i++)
{
scanf("%d",&opt);
if(opt==1)
{
scanf("%d%d",&x,&y);
update(1,id[x],id[x],y*1ll);
}
else if(opt==2)
{
scanf("%d%d",&x,&y);
update(1,id[x],mx[x],y*1ll);
}
else {
scanf("%d",&x);
querry(x);
}
}
return 0;
}

  

BZOJ 4034 洛谷3178 树上操作题解的更多相关文章

  1. [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)

    [BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...

  2. BZOJ 1500 洛谷2042维护序列题解

    BZ链接 洛谷链接 这道题真是丧心病狂.... 应该很容易就可以看出做法,但是写代码写的....... 思路很简单,用一个平衡树维护一下所有的操作就好了,重点讲解一下代码的细节 首先如果按照常规写法的 ...

  3. 洛谷P3178 树上操作 [HAOI2015] 树链剖分

    正解:树链剖分+线段树 解题报告: 传送门! 树链剖分+线段树算是基操了趴,,, 就无脑码码码,没有任何含金量,不需要动脑子,然后码量其实也不大,就很爽 比树剖的板子还要板子一些hhhhh 放下代码就 ...

  4. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  5. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  6. [洛谷U40581]树上统计treecnt

    [洛谷U40581]树上统计treecnt 题目大意: 给定一棵\(n(n\le10^5)\)个点的树. 定义\(Tree[l,r]\)表示为了使得\(l\sim r\)号点两两连通,最少需要选择的边 ...

  7. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  8. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

  9. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

随机推荐

  1. UVA11722 Jonining with Friend

    Joining with Friend You are going from Dhaka to Chittagong by train and you came to know one of your ...

  2. spring源码学习之AOP(二)

    接着上一篇中的内容! 3.创建代理 在获取了所有的bean对应的增强器之后,便可以进行代理的创建了org.springframework.aop.framework.autoproxy包下的Abstr ...

  3. 洛谷P3298 泉

    时空限制 1000ms / 128MB 题目描述 作为光荣的济南泉历史研究小组中的一员,铭铭收集了历史上x个不同年份时不同泉区的水流指数,这个指数是一个小于. 2^30的非负整数.第i个年份时六个泉区 ...

  4. 一次.NET项目反编译的实战经验(WinForm)

    最近由于业务需求,需要对一个老项目进行功能调整.但是项目的源代码已经找不到了.所以只能尝试对项目行进反编译. 一.反编译工具的选择 提到.NET的反编译,第一个想到的就是大名鼎鼎的Reflector. ...

  5. [jnhs]netbeans使用debug模式频繁出现java.lang.OutOfMemoryError: PermGen space内存不足

    netbeans赠送的tomcat7 windows解决方法: 修改C:\Program Files\Apache Software Foundation\Apache Tomcat 8.0.27\b ...

  6. CSS:你真的懂margin吗?

    你真的了解margin吗?你知道margin有什么特性吗?你知道什么是垂直外边距合并? margin在块元素.内联元素中的区别?什么时候该用padding而不是margin?你知道负margin吗?你 ...

  7. Mac系统常用快捷键大全

    苹果Mac系统常用快捷键有很多,但是很多童鞋对于这些mac快捷键都不是很熟悉,今天小编为大家整理了一份Mac系统常用快捷键大全,大家快收藏起来吧!平时在使用mac系统的时候可以提高不少工作效率哦! M ...

  8. ES6中async和await说明和用法

    昨天看了一篇vue的教程,作者用async/ await来发送异步请求,从服务端获取数据,代码很简洁,同时async/await 已经被标准化,是时候学习一下了. 先说一下async的用法,它作为一个 ...

  9. 【react】react-bookManager

    作者可能是本意想要做一个图书管理系统,不过添加书籍的时候报错,所以简单的页面我们简单的看看 先上github地址:https://github.com/hesisi/react-bookManager ...

  10. farv

    http://weishu.me/ https://github.com/jimupon/VirtualXposed O:  ?  api 26 - vdex N: speed-profile M: ...