洛谷 3178 [HAOI2015]树上操作
【题解】
就是个树链剖分的模板题。
#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
#define rg register
#define N 200010
#define ls (u<<1)
#define rs (u<<1|1)
#define mid ((a[u].l+a[u].r)>>1)
using namespace std;
int n,m,tot,cnt,opt,last[N],fa[N],hvy[N],top[N],dep[N],dfn[N],siz[N],poi[N],v[N];
struct edge{
int to,pre;
}e[N<<];
struct tree{
int l,r; LL sum,del;
}a[N<<];
inline int read(){
int k=,f=; char c=getchar();
while(c<''||c>'')c=='-'&&(f=-),c=getchar();
while(''<=c&&c<='')k=k*+c-'',c=getchar();
return k*f;
}
void dfs1(int x){
siz[x]=; dep[x]=dep[fa[x]]+;
for(rg int i=last[x],to;i;i=e[i].pre)if((to=e[i].to)!=fa[x]){
fa[to]=x; dfs1(to); siz[x]+=siz[to];
if(siz[to]>siz[hvy[x]]) hvy[x]=to;
}
}
void dfs2(int x,int tp){
top[x]=tp; dfn[x]=++cnt; poi[cnt]=x;
if(hvy[x]) dfs2(hvy[x],tp);
for(rg int i=last[x],to;i;i=e[i].pre)if((to=e[i].to)!=fa[x]&&to!=hvy[x])
dfs2(to,to);
}
void build(int u,int l,int r){
a[u].l=l; a[u].r=r;
if(l<r) build(ls,l,mid),build(rs,mid+,r),a[u].sum=a[ls].sum+a[rs].sum;
else a[u].sum=v[poi[l]];
}
inline void pushdown(int u){
LL d=a[u].del; a[u].del=;
a[ls].sum+=1LL*d*(a[ls].r-a[ls].l+); a[ls].del+=d;
a[rs].sum+=1LL*d*(a[rs].r-a[rs].l+); a[rs].del+=d;
}
void update(int u,int l,int r,LL del){
if(l<=a[u].l&&a[u].r<=r){
a[u].sum+=1LL*del*(a[u].r-a[u].l+);
a[u].del+=del;
return;
}
if(a[u].del) pushdown(u);
if(l<=mid) update(ls,l,r,del);
if(r>mid) update(rs,l,r,del);
a[u].sum=a[ls].sum+a[rs].sum;
}
LL query(int u,int l,int r){
if(l<=a[u].l&&a[u].r<=r) return a[u].sum;
if(a[u].del) pushdown(u); LL ret=;
if(l<=mid) ret+=query(ls,l,r);
if(r>mid) ret+=query(rs,l,r);
return ret;
}
int main(){
n=read(); m=read();
for(rg int i=;i<=n;i++) v[i]=read();
for(rg int i=;i<n;i++){
int u=read(),v=read();
e[++tot]=(edge){v,last[u]}; last[u]=tot;
e[++tot]=(edge){u,last[v]}; last[v]=tot;
}
dfs1(); dfs2(,); build(,,n);
while(m--){
// printf("[--> %lld]",query(1,dfn[2],dfn[2]+1));
opt=read();
if(opt==){
int x=read(),y=read();
update(,dfn[x],dfn[x],y);
}
else{
if(opt==){
int x=read(),y=read();
update(,dfn[x],dfn[x]+siz[x]-,y);
}
else{
int x=read(),t=top[x]; LL ret=;
while(x){
ret+=query(,dfn[t],dfn[x]);
x=fa[t]; t=top[x];
// printf("[%d]\n",x);
}
printf("%lld\n",ret);
}
}
}
return ;
}
洛谷 3178 [HAOI2015]树上操作的更多相关文章
- 洛谷P3178 [HAOI2015]树上操作(dfs序+线段树)
P3178 [HAOI2015]树上操作 题目链接:https://www.luogu.org/problemnew/show/P3178 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边 ...
- 洛谷——P3178 [HAOI2015]树上操作
https://www.luogu.org/problem/show?pid=3178#sub 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 ...
- 洛谷P3178 [HAOI2015]树上操作
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...
- 洛谷P3178 [HAOI2015]树上操作(线段树)
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...
- 洛谷 P3178 [HAOI2015]树上操作
题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种:操作 1 :把某个节点 x 的点权增加 a .操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 ...
- 洛谷P3178 [HAOI2015]树上操作 题解 树链剖分+线段树
题目链接:https://www.luogu.org/problem/P3178 这道题目是一道树链剖分的模板题. 但是在解决这道问题的同事刷新了我的两个认识: 第一个认识是:树链剖分不光可以处理链, ...
- 洛谷 P3177 [HAOI2015]树上染色 树形DP
洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...
- BZOJ4033或洛谷3177 [HAOI2015]树上染色
BZOJ原题链接 洛谷原题链接 很明显的树形\(DP\). 因为记录每个点的贡献很难,所以我们可以统计每条边的贡献. 对于每一条边,设边一侧的黑点有\(B_x\)个,白点有\(W_x\),另一侧黑点有 ...
- 洛谷 P3177 [HAOI2015]树上染色
题目链接 题目描述 有一棵点数为 \(N\) 的树,树边有边权.给你一个在 \(0~ N\) 之内的正整数 \(K\) ,你要在这棵树中选择 \(K\)个点,将其染成黑色,并将其他 的\(N-K\)个 ...
随机推荐
- 利用Oracle内置分析函数进行高效统计汇总
分析函数是Oracle从8.1.6开始引入的一个新的概念,为我们分析数据提供了一种简单高效的处理方式.在分析函数出现以前,我们必须使用自联查询,子查询或者内联视图,甚至复杂的存储过程实现的语句,现 ...
- Redis: Redis on Windows Setup
ylbtech-Redis: Redis on Windows Setup 1.返回顶部 1. 2. 3. 4. 5. 6. 7. 8. 9. 2.返回顶部 3.返回顶部 4.返回顶部 5 ...
- 昆石VOS2009 VOS3000无漏洞去后门电脑管理客户端大全
注意:您的VOS是什么版本的请使用什么版本的管理客户端,否则无法登陆! ** VOS2009的: ** VOS2009-client-v2.1.2.0.exe 点击这里下载: VOS2009-clie ...
- E20171214-sl
well-grounded 地基打的好 relevent adj. 有关的,中肯的; 相关联的 proposal n. 建议; 提议; 求婚; 〈美〉投标;
- crosswalk 初步使用
这里简单的说下 crossWalk 的配置; 我在学习 crosswalk 的时候,看到一篇博客,他所记录的已经是很完整的教程了: 点击查看 本文就根据该博客和官网说明,进行部分修改,补充; 首先 c ...
- Windows 7上安装Microsoft Loopback Adapter(微软环回网卡)
Oracle 安装过程中,先决条件检查遇到如下错误: 正在检查网络配置要求... 检查完成.此次检查的总体结果为: 失败 <<<< 问题: 安装检测到系统的主 IP 地址是 ...
- Redis基础---5个基本数据结构(比较性记忆)
“ Redis是一个内存数据库,只用硬盘来进行持久化. Mongodb是半内存数据库 Mysql是硬盘数据库 ” 1. Redis启动 安装好了之后.运行redis-3.2.8/src/下的redis ...
- Windows Install Twisted 安装Twisted
1.下载twisted exe https://twistedmatrix.com/Releases/Twisted/15.4/ (注意最新版16.x没有适用于windows的exe,只能用旧版) 2 ...
- EasyUI系列学习(五)-Resizable(调整大小)
一.创建组件 1.使用标签创建可变大小的窗口 <div id="rBox" class="easyui-resizable" style="wi ...
- thinkphp信息修改和分页
关联两个数据表,在Model里建立StuModel.class.php: <?php //Belongs_to 关联表示当前模型从属于另外一个父对象 namespace Admin\Model; ...