洛谷——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 ...
随机推荐
- SQL经典面试题集锦
1.问题背景 (1)学生表(学号,姓名,年龄,性别) student(S#,Sname,Sage,Ssex) (2)课程表(课程编号,课程名称,教师编号) course(C#,Cname,T#) (3 ...
- LeetCode 893. Groups of Special-Equivalent Strings (特殊等价字符串组)
题目标签:String 题目可以让在 偶数位置的 chars 互换, 也可以让 在 奇数位置的 chars 互换. 所以为了 return 正确的 group 数量,需要把 那些重复的 给排除掉. 可 ...
- 数据分析在web交互设计中的作用 页面跳出率 100% 原因分析
通过分析访问的路径,发现,访问者访问其他页面,直接跳出 页面跳出率 100% 说明: 连作者都发现的导航路径不清晰 对导航进行改版:清晰.明了
- html 转word
今日头条发表文章 python-docx — python-docx 0.8.6 documentation http://python-docx.readthedocs.io/en/latest/
- IOS 数据存储之 Core Data具体解释
Core Date是ios3.0后引入的数据持久化解决方式,它是是苹果官方推荐使用的.不须要借助第三方框架.Core Date实际上是对SQLite的封装.提供了更高级的持久化方式.在对数据库操作时, ...
- SoapUI项目书写自我规范
-->Assertions 判断某个节点存在(_input_name, _button_name) -->Resource 文件夹命名 值去掉红色部分信息 https://mercury- ...
- ES mapping可以修改include_in_all,也可以修改index_options,norm,但是无法修改_all属性!
ES mapping可以修改include_in_all,也可以修改index_options,norm,但是无法修改_all属性! curl -XPOST "http://localhos ...
- JSP-Runoob:JSP 点击量统计
ylbtech-JSP-Runoob:JSP 点击量统计 1.返回顶部 1. JSP 点击量统计 有时候我们需要知道某个页面被访问的次数,这时我们就需要在页面上添加页面统计器,页面访问的统计一般在用户 ...
- codevs3342绿色通道(单调队列优化dp)
3342 绿色通道 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 黄金 Gold 题目描述 Description <思远高考绿色通道>(Green Pass ...
- 《Akka应用模式:分布式应用程序设计实践指南》读书笔记9
性能 这也是一个比较大的问题,因为性能不一定是Akka本身的问题,还可能是你代码写的有问题. 优化的第一步就是找出性能的瓶颈,隔离出应用程序里面比较耗时的部分,然后尝试对其优化,减少需要耗费的时间成本 ...