Brief Description

您需要设计一种数据结构支持以下操作:

  1. 把某个节点 x 的点权增加 a 。
  2. 把某个节点 x 为根的子树中所有点的点权都增加 a 。
  3. 询问某个节点 x 到根的路径中所有点的点权和。

Algorithm Design

我们考察操作对于查询的贡献。

对于操作1,如果节点y是节点x的后代,那么可以贡献\(a\)

对于操作2,如果节点y是节点x的后代,那么可以贡献\(a*(dep_y-dep_x+1)\)

我们可以使用两个树状数组来维护贡献。

Code

#include <cstdio>
#define lowbit(i) (i) & -(i)
const int maxn = 101000;
#define ll long long
ll bit[2][maxn];
ll n, m, cnt = 0;
void change(ll id, ll pos, ll val) {
for (ll i = pos; i <= n; i += lowbit(i)) {
bit[id][i] += val;
}
}
ll query(ll id, ll pos) {
ll ans = 0;
for (ll i = pos; i; i -= lowbit(i)) {
ans += bit[id][i];
}
return ans;
}
struct edge {
ll to, next;
} e[maxn << 1];
ll l[maxn], r[maxn], dfn = 0, val[maxn], deep[maxn], head[maxn], q[maxn];
void add(ll x, ll y) {
e[++cnt].to = y;
e[cnt].next = head[x];
head[x] = cnt;
}
void add_edge(ll x, ll y) {
add(x, y);
add(y, x);
}
void dfs(ll x, ll fa) {
l[x] = ++dfn;
q[dfn] = x;
for (ll i = head[x]; i; i = e[i].next) {
if (e[i].to != fa) {
deep[e[i].to] = deep[x] + 1;
dfs(e[i].to, x);
}
}
r[x] = dfn;
}
int main() {
// freopen("haoi2015_t2.in", "r", stdin);
// freopen("haoi2015_t2.out", "w", stdout);
scanf("%lld %lld", &n, &m);
for (ll i = 1; i <= n; i++) {
scanf("%lld", &val[i]);
}
for (ll i = 1; i < n; i++) {
ll x;
ll y;
scanf("%lld %lld", &x, &y);
add_edge(x, y);
}
dfs(1, 0);
for (ll i = 1; i <= n; i++) {
change(1, l[i], val[i]);
change(1, r[i] + 1, -val[i]);
}
while (m--) {
ll opt, x, y;
scanf("%lld %lld", &opt, &x);
if (opt == 1) {
scanf("%lld", &y);
change(1, l[x], y);
change(1, r[x] + 1, -y);
}
if (opt == 2) {
scanf("%lld", &y);
change(0, l[x], y);
change(1, l[x], -deep[x] * y + y);
change(0, r[x] + 1, -y);
change(1, r[x] + 1, deep[x] * y - y);
}
if (opt == 3) {
printf("%lld\n", query(0, l[x]) * deep[x] + query(1, l[x]));
}
}
}

最新文章

  1. Sublime Text3 安装markdown插件
  2. C# 水印透明度图片
  3. AOP 之 6.1 AOP基础(拾陆)
  4. Python科学计算(一)环境简介——Anaconda Python
  5. openerp学习笔记 视图更新时删除已存在的菜单或其他对象
  6. 两年的坚持,最后还是决定将ISoft开源
  7. BZOJ2818: Gcd 莫比乌斯反演
  8. Bootstrap3学习笔记
  9. CountDownLatch类的使用
  10. python3 re正则匹配数据获取案例
  11. iOS手势之pinch
  12. 如何用Dreamweaver编辑rails的html.erb文件
  13. 简简单单的Vue3(插件开发,路由系统,状态管理)
  14. 老男孩Python全栈学习 S9 日常作业 011
  15. Oracle GoldenGate微服务架构的服务Shell脚本
  16. python模块之configparse模块
  17. gitlab备份还原
  18. centos7之docker安装
  19. python闭包的理解说明
  20. coercing to Unicode: need string or buffer, int found报错

热门文章

  1. [电子书] 《Android编程兵书》PDF
  2. 步骤1:JMeter 录制脚本接口测试
  3. Ubuntu 安装Google浏览器
  4. Visual Studio 2017离线安装包
  5. React错误总结解决方案(二)
  6. android4.1 Wifi 浅析
  7. Spring定时器调用Hibernate方法无法获得SessionFactory的解决办法
  8. 浅谈c语言和c++中struct的区别
  9. lintcode-84-落单的数 III
  10. 我和C语言程序