【bzoj4034】[HAOI2015]T2
siz[v]表示以v为根的子树的节点数
top[v]表示v所在的重链的顶端节点
fa[v]表示v的父亲
pos[v]表示v的父边标号
mx[v]表示v的子树中边的标号最大的那条边
参考:http://blog.sina.com.cn/s/blog_6974c8b20100zc61.html
题意:
有一棵点数为 N 的树,以点 1 为根,且树点有边权。然后有 M 个
第一次写树链剖分。。
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; typedef long long LL; #define N 100010 int id;
int fa[N],siz[N],top[N];
int head[N],pos[N],mx[N],v[N];
LL sum[N<<],add[N<<]; struct Node
{
int to,next;
}e[N<<];
int cnt; int n,m;
int uu,vv; int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} void link(int x,int y)
{
e[++cnt]=(Node){y,head[x]};
head[x]=cnt;
} void dfs(int x)
{
siz[x]=;
for (int i=head[x];i;i=e[i].next)
if (e[i].to!=fa[x])
{
fa[e[i].to]=x;
dfs(e[i].to);
siz[x]+=siz[e[i].to];
mx[x]=max(mx[x],mx[e[i].to]);
}
} void dfs2(int x,int cha)
{
top[x]=cha;pos[x]=mx[x]=++id;
int k=;
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)
{
dfs2(k,cha);mx[x]=max(mx[x],mx[k]);
}
for(int i=head[x];i;i=e[i].next)
if(e[i].to!=fa[x]&&e[i].to!=k)
{
dfs2(e[i].to,e[i].to);
mx[x]=max(mx[x],mx[e[i].to]);
}
} void pushup(int now)
{
sum[now]=sum[now<<]+sum[now<<|];
} void pushdown(int nowl,int nowr,int now)
{
if (nowl==nowr)
return;
int mid=(nowl+nowr)>>;
LL t=add[now];
add[now]=;
add[now<<]+=t;
add[now<<|]+=t;
sum[now<<]+=t*(mid-nowl+);
sum[now<<|]+=t*(nowr-mid);
} void update(int nowl,int nowr,int now,int l,int r,LL d)
{
if (add[now])
pushdown(nowl,nowr,now);
if (nowl==l && nowr==r)
{
add[now]+=d;
sum[now]+=(nowr-nowl+)*d;
return ;
}
int mid=(nowl+nowr)>>;
if (l<=mid)
update(nowl,mid,now<<,l,min(r,mid),d);
if (r>mid)
update(mid+,nowr,now<<|,max(l,mid+),r,d);
pushup(now);
} LL query(int nowl,int nowr,int now,int l,int r)
{
if (add[now])
pushdown(nowl,nowr,now);
if (nowl==l && nowr==r)
return sum[now];
int mid=(nowl+nowr)>>;
LL ans=;
if (l<=mid)
ans+=query(nowl,mid,now<<,l,min(mid,r));
if (r>mid)
ans+=query(mid+,nowr,now<<|,max(mid+,l),r);
return ans;
} LL query(int x)
{
LL ans=;
while (top[x]!=)
{
ans+=query(,n,,pos[top[x]],pos[x]);
x=fa[top[x]];
}
ans+=query(,n,,,pos[x]);
return ans;
} int main()
{
n=read(),m=read();
for (int i=;i<=n;i++)
v[i]=read();
for (int i=;i<n;i++)
{
uu=read(),vv=read();
link(uu,vv);
link(vv,uu);
}
dfs();
dfs2(,);
for (int i=;i<=n;i++)
update(,n,,pos[i],pos[i],v[i]);
int askd,x,a;
while (m--)
{
askd=read(),x=read();
if (askd==)
{
a=read();
update(,n,,pos[x],pos[x],a);
}
if (askd==)
{
a=read();
update(,n,,pos[x],mx[x],a);
}
if (askd==)
printf("%lld\n",query(x));
}
return ;
}
【bzoj4034】[HAOI2015]T2的更多相关文章
- 【BZOJ4034】[HAOI2015]树上操作 树链剖分+线段树
[BZOJ4034][HAOI2015]树上操作 Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 ...
- 【bzoj4034】[HAOI2015]树上操作
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都 ...
- 【BZOJ4036】[HAOI2015]按位或 FWT
[BZOJ4036][HAOI2015]按位或 Description 刚开始你有一个数字0,每一秒钟你会随机选择一个[0,2^n-1]的数字,与你手上的数字进行或(c++,c的|,pascal的or ...
- 【BZOJ4033】[HAOI2015]树上染色 树形DP
[BZOJ4033][HAOI2015]树上染色 Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并将其他的N-K个点染 ...
- 【NOIP2016】DAY1 T2 天天爱跑步
[NOIP2016]DAY1 T2 天天爱跑步 Description 小c同学认为跑步非常有趣,于是决定制作一款叫做<天天爱跑步>的游戏.?天天爱跑步?是一个养成类游戏,需要玩家每天按时 ...
- 【BZOJ4034】T2(树链剖分)
题意: 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增 ...
- 【BZOJ4034】【HAOI2015】树上操作
题目请自行查阅传送门. 典型的树剖题,线段树维护操作,记一下子树在线段树内范围即可. 时间复杂度:\( O(m \log^{2} n) \) #include <stdio.h> #def ...
- 【SRM】649 t2
题意 一个数列\(A\),数的范围均在\([0, 2^N-1]\)内,求一个\(B\),使得新生成的数列\(C\)中逆序对最多(\(C_i = A_i xor B\)),输出最多的逆序对.(\(|A| ...
- 【nowcoder】 4th T2 区间
题目链接:https://www.nowcoder.com/acm/contest/175/B 当你为时间复杂度挠头的时候 别人已经33行拿满分了 #include<cstdio> #in ...
随机推荐
- vim跳转(一)
参考资料:http://easwy.com/blog/archives/advanced-vim-skills-basic-move-method/ 在normal模式下使用如下命令 1.h, j, ...
- pytorch: Variable detach 与 detach_
pytorch 的 Variable 对象中有两个方法,detach和 detach_ 本文主要介绍这两个方法的效果和 能用这两个方法干什么. detach 官方文档中,对这个方法是这么介绍的. 返回 ...
- CF508E Arthur and Brackets
题目大意:给出n对括号,并给出每对括号距离的范围.问能否找到这样一个序列. 题解:好多人都用贪心.这么好的题为什么不搜一发呢? 注意:千万不要在dfs里面更新答案. 代码: #include<c ...
- MySQL简单查询和单表查询
MySQL记录操作 概览 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用 ...
- STM32——NVIV:嵌套中断向量控制器
STM32有43个channel的settable的中断源:AIRC(Application Interrupt and Reset Register)寄存器中有用于指定优先级的4 bits.这4个b ...
- Shader Wave
Shader Wave 一.原理 1. 采用 UV 坐标为原始数据,生成每一条波浪线. 2. 使用 Unity 的 Time.y 作为时间增量,动态变换波形. 二.操作步骤 1. 首先使用纹理坐标生成 ...
- 从Hadoop框架讨论大数据
[Hadoop是什么?] 1)Hadoop 是一个由 Apache 基金会所开发的分布式系统基础架构. 2)主要解决,海量数据的存储和海量数据的分析计算问题. 3)广义上来说,HADOOP 通常是指一 ...
- centos相关
查看虚拟机里的Centos7的IP:ip addr或者ifconfig ---https://blog.csdn.net/dancheren/article/details/73611878 Cen ...
- java中装箱与拆箱
转载自:https://www.cnblogs.com/dolphin0520/p/3780005.html 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若 ...
- BNUOJ 2947 Buy Tickets
Buy Tickets Time Limit: 4000ms Memory Limit: 65536KB This problem will be judged on PKU. Original ID ...