洛谷——P3833 [SHOI2012]魔法树
P3833 [SHOI2012]魔法树
题目背景
SHOI2012 D2T3
题目描述
Harry Potter 新学了一种魔法:可以让改变树上的果子个数。满心欢喜的他找到了一个巨大的果树,来试验他的新法术。
这棵果树共有N个节点,其中节点0是根节点,每个节点u的父亲记为fa[u],保证有fa[u] < u。初始时,这棵果树上的果子都被 Dumbledore 用魔法清除掉了,所以这个果树的每个节点上都没有果子(即0个果子)。
不幸的是,Harry 的法术学得不到位,只能对树上一段路径的节点上的果子个数统一增加一定的数量。也就是说,Harry 的魔法可以这样描述:
Add u v d
表示将点u和v之间的路径上的所有节点的果子个数都加上d。
接下来,为了方便检验 Harry 的魔法是否成功,你需要告诉他在释放魔法的过程中的一些有关果树的信息:
Query u
表示当前果树中,以点u为根的子树中,总共有多少个果子?
输入输出格式
输入格式:
第一行一个正整数N (1 ≤ N ≤ 100000),表示果树的节点总数,节点以0,1,…,N − 1标号,0一定代表根节点。
接下来N − 1行,每行两个整数a,b (0 ≤ a < b < N),表示a是b的父亲。
接下来是一个正整数Q(1 ≤ ? ≤ 100000),表示共有Q次操作。
后面跟着Q行,每行是以下两种中的一种:
A u v d,表示将u到v的路径上的所有节点的果子数加上d;0 ≤ u,v <N,0 < d < 100000
Q u,表示询问以u为根的子树中的总果子数,注意是包括u本身的。
输出格式:
对于所有的Query操作,依次输出询问的答案,每行一个。答案可能会超过2^32 ,但不会超过10^15 。
输入输出样例
树链剖分模板题,注意一下细节即可
#include<bits/stdc++.h> #define N 1010100
#define LL long long
using namespace std; struct node {
LL to,next;
} e[N];
struct tree {
LL l,r,w,f;
} tr[N]; LL n,m,head[N],tot,ans; //(u,v)树上修改
//询问子树大小 void add(LL u,LL v) {
e[++tot].to=v,e[tot].next=head[u],head[u]=tot;
} LL dep[N],siz[N],son[N],fa[N];
void dfs(LL u,LL f,LL deep) {
dep[u]=deep,siz[u]=,fa[u]=f;
LL maxson=-;
for(LL i=head[u]; i; i=e[i].next) {
LL v=e[i].to;
if(v==f) continue;
dfs(v,u,deep+);
siz[u]+=siz[v];
if(siz[v]>maxson) maxson=siz[v],son[u]=v;
}
} LL top[N],id[N],item;
void dfs2(LL u,LL topf) {
id[u]=++item,top[u]=topf;
if(!son[u]) return;
dfs2(son[u],topf);
for(LL i=head[u]; i; i=e[i].next) {
LL v=e[i].to;
if(v==fa[u]||v==son[u]) continue;
dfs2(v,v);
}
} void build(LL k,LL l,LL r) {
tr[k].l=l,tr[k].r=r;
if(l==r) return;
LL mid=(l+r)/;
build(k*,l,mid);
build(k*+,mid+,r);
} void upda(LL k) {
tr[k].w=tr[k*].w+tr[k*+].w;
}
void down(LL k) {
LL f=tr[k].f;
tr[k].f=;
tr[k*].w=(tr[k*].w+f*(tr[k*].r-tr[k*].l+));
tr[k*+].w=(tr[k*+].w+f*(tr[k*+].r-tr[k*+].l+));
tr[k*].f+=f,tr[k*+].f+=f;
} void change_LLerval(LL k,LL l,LL r,LL p) {
LL ll=tr[k].l,rr=tr[k].r,mid=(ll+rr)/;
if(ll>=l&&rr<=r) {
tr[k].w=(tr[k].w+(rr-ll+)*p);
tr[k].f+=p;
return;
}
if(tr[k].f) down(k);
if(l<=mid) change_LLerval(k*,l,r,p);
if(r>mid) change_LLerval(k*+,l,r,p);
upda(k);
} void ask_LLerval(LL k,LL l,LL r) {
LL ll=tr[k].l,rr=tr[k].r,mid=(ll+rr)/;
if(ll>=l&&rr<=r) {
ans+=tr[k].w;
return;
}
if(tr[k].f) down(k);
if(l<=mid) ask_LLerval(k*,l,r);
if(r>mid) ask_LLerval(k*+,l,r);
upda(k);
} void change(LL a,LL b,LL p) {
while(top[a]!=top[b]) {
if(dep[top[a]]<dep[top[b]]) swap(a,b);
change_LLerval(,id[top[a]],id[a],p);
a=fa[top[a]];
}
if(dep[a]<dep[b]) swap(a,b);
change_LLerval(,id[b],id[a],p);
} LL sum(LL a) {
ans=;
ask_LLerval(,id[a],id[a]+siz[a]-);
return ans;
} int main() {
scanf("%lld",&n);
for(LL a,b,i=; i<n; i++) {
scanf("%lld%lld",&a,&b);
add(a+,b+);
}
dfs(,,);
dfs2(,);
build(,,n);
scanf("%lld",&m);
for(LL a,b,c,i=; i<=m; i++) {
char x;
cin>>x;
if(x=='A') {
scanf("%lld%lld%lld",&a,&b,&c);
change(a+,b+,c);
} else {
scanf("%lld",&a);
printf("%lld\n",sum(a+));
}
}
return ;
}
洛谷——P3833 [SHOI2012]魔法树的更多相关文章
- 洛谷 P3833 [SHOI2012]魔法树
题目背景 SHOI2012 D2T3 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的新法术. 这棵果树共有N个节点,其中节点 ...
- [洛谷P3833][SHOI2012]魔法树
题目大意:给一棵树,路径加,子树求和 题解:树剖 卡点:无 C++ Code: #include <cstdio> #include <iostream> #define ma ...
- 洛谷3833 [SHOI2012]魔法树
SHOI2012 D2T3 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的新法术. 这棵果树共有N个节点,其中节点0是根节点 ...
- P3833 [SHOI2012]魔法树
思路 树剖板子 注意给出点的编号是从零开始的 代码 #include <cstdio> #include <algorithm> #include <cstring> ...
- 洛谷P3833 [SHOI2012]魔法树(树链剖分)
传送门 树剖板子…… 一个路径加和,线段树上打标记.一个子树询问,dfs的时候记录一下子树的区间就行 // luogu-judger-enable-o2 //minamoto #include< ...
- [SHOI2012]魔法树
题目:洛谷P3833. 题目大意:给你一棵树,有两种操作:1.给两个点和它们之间的最短路上的所有点加上一个值:2.询问以某个点为根的子树的子树和.你需要实现这个功能. 解题思路:如果只有最后才询问的话 ...
- 树链剖分【洛谷P3833】 [SHOI2012]魔法树
P3833 [SHOI2012]魔法树 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的新法术. 这棵果树共有N个节点,其中节 ...
- 树链剖分【P3833】 [SHOI2012]魔法树
Description Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的新法术. 这棵果树共有N个节点,其中节点0是根节点,每个节点u的 ...
- 题解 P3833 【[SHOI2012]魔法树】
题目 直通车 很显然这是个树刨的板子,树上链查询和子树查询 注意: 1.这个点的树根为 0 而不是 1 所以注意读图时点标号 +1 就解决了 2.注意数据范围\(2^{32}\) 然后板子就能过了 n ...
随机推荐
- 利用 gnuplot_i 在你的 c 程序中调用 GNUPLOT
这是一篇非常早曾经写的小文章,最初发表于我的搜狐博客(2008-09-23 22:55).由于自从转移到这里后,sohu 博客就不再维护了,所以把这篇文章也一起挪了过来. GNUPLOT 是一款功能强 ...
- Linux系统centos7+VMwareWorkstation创建共享文件夹错误解决方法集锦
在创建共享文件夹过程中出现了多种错误,多次尝试后终于解决了. 1.直接找到VMware Tools压缩包的位置:/run/media/wxy/VMware\ Tools /**省去了创建光盘挂载点:m ...
- 某Android手游的lua源码逆向分析与还原
近日分析某一款Android上面的手游,反编译后再起asset目录下可以看到加密过的脚本,lib目录下发现lua的so 初步怀疑其使用lua脚本实现的 解密函数定位 动态跟踪解密函数流程 静态分析解密 ...
- 【Aladdin Unity3D Shader编程】之二 光照模型(一)
光照模型 光照模型就是一个公式,使用这个公式来计算在某个点的光照效果. 在标准光照模型里面,我们把进入摄像机的光分为下面四个部分: 自发光 类似生活中的萤火虫等自己能够发光 高光反射 类似生活中的镜子 ...
- Codeforces Beta Round #67 (Div. 2)C. Modified GCD
C. Modified GCD time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...
- [Supervisor]supervisor监管gunicorn启动DjangoWeb时异常退出
一开始配置 [program:django_web] command=gunicorn -w 4 -b 0.0.0.0:8080 superadmin.wsgi:application directo ...
- android apk 防止反编译技术第三篇-加密
上一篇我们讲了apk防止反编译技术中的加壳技术,如果有不明白的可以查看我的上一篇博客http://my.oschina.net/u/2323218/blog/393372.接下来我们将介绍另一种防止a ...
- day24 03 多继承
day24 03 多继承 正常的代码中 单继承==减少了代码的重复 继承表达的是一种 子类是父类的关系 1.简单的多继承关系 A,B,C,D四个类,其中D类继承A,B,C三个父类,因此也叫多继承,子 ...
- 蛤玮学计网 -- 简单的判断ip
心累 , 狗日的想了好多数据 , ......啥也不说了 我去哭一会 . #include<stdio.h> #include<string.h> #include<m ...
- BZOJ 2178 Simpson积分
思路: 我发现能用Simpson积分水的题 好像都是裸题诶233333 //By SiriusRen #include <bits/stdc++.h> using namespace s ...