CF396C On Changing Tree

给定一棵以 \(1\) 为根的树,初始时所有点权为 \(0\)

有 \(m\) 次操作,分为两种

\(1\ u\ x\ k\) 表示给以 \(u\) 的子树中的每一个点 \(v\) 点权增加 \(x-k\times dis(u,\ v)\)

\(2\ u\) 查询点 \(u\) 的点权模 \(10^9+7\) 的值

\(n,\ m\leq3\times10^5\)

dfs序,树状数组


把操作 \(1\) 中的 \(dis(u,\ v)\) 拆成 \(dep_v-dep_u\) , \(v\) 增加的点权即为 \(x-k\times(dep_v-dep_u)\)

即 \((x+k\times dep_u)-(k\times dep_v)\)

将上式分为 \(x+k\times dep_u\) 和 \(k\times dep_v\) 分别维护

\(1\) 式可以直接用树状数组维护。因为对于每个 \(v\) , \(dep_v\) 是定值,所以 \(2\) 式可以用树状数组维护每个节点的 \(k\) 来解决

输出答案时将两式合并即可

时间复杂度 \(O(n\log n)\)

代码

#include <bits/stdc++.h>
using namespace std; const int maxn = 3e5 + 10, P = 1e9 + 7;
int n, m, fa[maxn], sz[maxn], tid[maxn], dep[maxn]; inline int inc(int x, int y) {
return x + y < P ? x + y : x + y - P;
} inline int dec(int x, int y) {
return x - y < 0 ? x - y + P : x - y;
} struct BIT {
int c[maxn]; void add(int pos, int x) {
for (; pos <= n; pos += pos & -pos) {
c[pos] = inc(c[pos], x);
}
} int query(int pos) {
int res = 0;
for (; pos; pos &= pos - 1) {
res = inc(res, c[pos]);
}
return res;
} void add(int l, int r, int x) {
add(l, x), add(r + 1, dec(0, x));
}
} t1, t2; vector <int> e[maxn]; int dfs(int u) {
static int now;
tid[u] = ++now;
for (int v : e[u]) {
sz[u] += dfs(v);
}
return ++sz[u];
} int main() {
scanf("%d", &n);
for (int i = 2; i <= n; i++) {
scanf("%d", fa + i);
e[fa[i]].push_back(i);
dep[i] = dep[fa[i]] + 1;
}
dfs(1);
scanf("%d", &m);
while (m--) {
int op, u, x, k;
scanf("%d %d", &op, &u);
int l = tid[u], r = tid[u] + sz[u] - 1;
if (op == 1) {
scanf("%d %d", &x, &k);
t1.add(l, r, inc(x, 1ll * dep[u] * k % P));
t2.add(l, r, k);
} else {
printf("%d\n", dec(t1.query(l), 1ll * dep[u] * t2.query(l) % P));
}
}
return 0;
}

CF396C On Changing Tree的更多相关文章

  1. CodeForces 396C On Changing Tree

    On Changing Tree Time Limit: 2000ms Memory Limit: 262144KB This problem will be judged on CodeForces ...

  2. CodeForces369C On Changing Tree

    昨天的CF自己太挫了.一上来看到A题,就有思路,然后马上敲,但是苦于自己很久没有敲计数的题了,许多函数都稍微回忆了一阵子.A题的主要做法就是将每个数质因数分解,统计每个质因子的个数,对于每个质因子pi ...

  3. CodeForces - 396C On Changing Tree(树状数组)

    题目大意 给定一棵以1为根的树,初始时所有点为0 给出树的方式是从节点2开始给出每一个点的父亲 然后是 $m$ 次操作,分为两种 $1 v,k,x$ 表示在以v为根的子树中的每一个点上添加 $x-i* ...

  4. CDQ分治题目小结

    CDQ分治属于比较特殊的一类分治,许多问题转化为这类分治的时候,时空方面都会有很大节省,而且写起来没有这么麻烦. 这类分治的特殊性在于分治的左右两部分的合并,作用两部分在合并的时候作用是不同的,比如, ...

  5. Codeforces Round #232 (Div. 1)

    这次运气比较好,做出两题.本来是冲着第3题可以cdq分治做的,却没想出来,明天再想好了. A. On Number of Decompositions into Multipliers 题意:n个数a ...

  6. ASP.NET 生命周期(原文翻译)

    在网上看到这篇文章,老外写的,里面很多图片挺精致,顺带翻译过来给大家分享下,英语太次好多地方都翻不过来 ASP.NET application and page life cycle Download ...

  7. CQD(陈丹琦)分治 & 整体二分——专题小结

    整体二分和CDQ分治 有一些问题很多时间都坑在斜率和凸壳上了么--感觉斜率和凸壳各种搞不懂-- 整体二分 整体二分的资料好像不是很多,我在网上找到了一篇不错的资料:       整体二分是个很神的东西 ...

  8. web forms page和control的生命周期life cycle交互,以及page生命周期中每个event中需要做什么事情

    只有 page_load和page_init这些可以autoeventwireup RenderControl只提供override public override void RenderContro ...

  9. codeforces396C

    On Changing Tree CodeForces - 396C You are given a rooted tree consisting of n vertices numbered fro ...

随机推荐

  1. 还在用NuGet吗?大哥FuGet了解一下

    前言 你可能不知道是,NuGet已经发布10年了,从 Visual Studio 2010 第一次官方集成NuGet以来,这10年间有聚集了超过 14万 的包,这些包有超过 150万 的版本提供,大约 ...

  2. 解决 HomeBrew 下载缓慢的问题

    macOS 自身不提供包管理器,常用的包管理器有 HomeBrew MacPorts MacPorts 第一次使用要 build 整个基本库,编译时间很长.优点是不怎么依赖系统,更新 macOS 不会 ...

  3. 【Android Studio安装部署系列】一、JDK开发环境搭建

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 Android Studio安装后自带jre,这个自带jre的版本号肯定比最新的版本号要小. 但是如果项目中没有用到新版本jdk的特 ...

  4. Linux - 通过SecureCRT的rz、sz和sftp实现文件的上传和下载

    目录 1 通过rz/sz命令上传/下载 1.1 安装lrzsz软件 1.2 rz - 上传文件 1.3 sz - 下载文件 2 通过sftp上传/下载文件 2.1 关于SFTP的简介 2.2 SFTP ...

  5. Asp.Net Core 轻松学-利用xUnit进行主机级别的网络集成测试

    前言     在开发 Asp.Net Core 应用程序的过程中,我们常常需要对业务代码编写单元测试,这种方法既快速又有效,利用单元测试做代码覆盖测试,也是非常必要的事情:但是,但我们需要对系统进行集 ...

  6. 【转载】java static 关键字的四种用法

    原文链接点这里,感谢博主分享 在java的关键字中,static和final是两个我们必须掌握的关键字.不同于其他关键字,他们都有多种用法,而且在一定环境下使用,可以提高程序的运行性能,优化程序的结构 ...

  7. 面试被问烂的 Spring IOC(求求你别再问了)

    广义的 IOC IoC(Inversion of Control) 控制反转,即"不用打电话过来,我们会打给你". 两种实现: 依赖查找(DL)和依赖注入(DI). IOC 和 D ...

  8. 【译】《C# Tips -- Write Better C#》

    [译]<C# Tips -- Write Better C#> <C# 奇淫巧技 -- 编写更优雅的 C#> 目录 介绍(Introduction) 第一部分:各种奇淫巧技(P ...

  9. 调用链监控 CAT 之 URL埋点实践

    URL监控埋点作用 一个http请求来了之后,会自动打点,能够记录每个url的访问情况,并将以此请求后续的调用链路串起来,可以在cat上查看logview 可以在cat Transaction及Eve ...

  10. Android为TV端助力:adb查找包名位置

    logcat | grep START 查找启动launcher adb shell "pm list packages -f | grep +包名" 查找包的路径