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. 阿里云SLB出现502 Bad Gateway 错误排查解决方法

    502 Bad Gateway The proxy server received an invalid response from an upstream server. 原本系统是通过一个SLB转 ...

  2. 小白学习Python之路---开发环境的搭建

    本节内容 1.Python的介绍 2.发展史 3.安装Python 4.搭建开发环境 5.Hello World程序 一.Python的介绍 Python的创始人为荷兰人吉多·范罗苏姆(Guido v ...

  3. dataframe行变换为列

    新建一个 dataFrame : val conf = new SparkConf().setAppName("TTyb").setMaster("local" ...

  4. mysql的学习笔记(四)

    ---恢复内容开始--- 1.插入操作 INSERT (1)INSERT table_name(col_name,...) VALUES(...),(....) CREATE TABLE user( ...

  5. Mybatis之旅第三篇-SqlMapConfig.xml全局配置文件解析

    一.前言 刚换工作,为了更快的学习框架和了解业务,基本每天都会加班,导致隔了几天没有进行总结,心里总觉得不安,工作年限越长越感到学习的重要性,坚持下去!!! 经过前两篇的总结,已经基本掌握了mybat ...

  6. 【重学计算机】机组D7章:总线

    1. 系统总线的特性及应用 总线概念:将计算机系统中各部件连接起来 总线分类:(外部/内部,系统/非系统,串行/并行,同步/异步...) 按用途分类: 存储总线:cpu与存储器 系统总线:连接存储总线 ...

  7. Spring Boot 2.0 配置图文教程

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 ...

  8. 一套代码小程序&Web&Native运行的探索06——组件系统

    接上文:一套代码小程序&Web&Native运行的探索05——snabbdom 对应Git代码地址请见:https://github.com/yexiaochai/wxdemo/tre ...

  9. Java I/O不迷茫,一文为你导航!

    前言:在之前的面试中,每每问到关于Java I/O 方面的东西都感觉自己吃了大亏..所以这里抢救一下..来深入的了解一下在Java之中的 I/O 到底是怎么回事..文章可能说明类的文字有点儿多,希望能 ...

  10. Java并发专题(三)深入理解volatile关键字

    前言 上一章节简单介绍了线程安全以及最基础的保证线程安全的方法,建议大家手敲代码去体会.这一章会提到volatile关键字,虽然看起来很简单,但是想彻底搞清楚需要具备JMM.CPU缓存模型的知识.不要 ...