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. LOJ #6041. 「雅礼集训 2017 Day7」事情的相似度

    我可以大喊一声这就是个套路题吗? 首先看到LCP问题,那么套路的想到SAM(SA的做法也有) LCP的长度是它们在parent树上的LCA(众所周知),所以我们考虑同时统计多个点之间的LCA对 树上问 ...

  2. Intellij IDEA 阅读源码的 4 个绝技,我必须分享给你!

    前段时间分享了<阅读跟踪 Java 源码的几个小技巧>是基于 Eclipse 版本的,看大家的留言都是想要 IDEA 版本的源码阅读技巧. 所以,为了满足众多 IDEA 粉丝的要求,栈长我 ...

  3. 万能的Python,还能用来制作高大上的进度条?

    对于开发或者运维来说,使用Python去完成一些跑批任务,或者做一些监控事件是非常正常的情况.那么如何有效的监控任务的进度,除了在任务中加上log外,还能不能有另一种方式来了解任务进展到哪一步了呢? ...

  4. 利用SQL Profiler 追踪数据库操作

    SQL Server 事件探查器 是一个界面,用于创建和管理跟踪并分析和重播跟踪结果. 这些事件保存在一个跟踪文件中,稍后试图诊断问题时,可以对该文件进行分析或用它来重播一系列特定的步骤. SQL S ...

  5. Java〜slf4日志框架的使用

    slf4日志可以支持注解的方式开启它,然后在使用时直接使用占位符,而不需要手动拼接字符串,这点在性能上也做到了最好. 一 build.gradle依赖项 compileOnly('org.projec ...

  6. 秋招已过,各大厂的面试题分享一波 附C++实现

    数据结构和算法是面试的一座大山,尤其去面试大厂更是必不可少!简单说明一下为啥喜欢考数据结构和算法,首先,算法有用也没用,如果是中小型企业的简单业务逻辑,可能用不到啥算法,但大厂一定会用到,都知道数据库 ...

  7. 为什么有那么多人愿意喝"鸡汤"?

    什么是心灵鸡汤 心灵鸡汤,就是“充满知识与感情的话语”,柔软.温暖,充满正能量.心灵鸡汤是一种安慰剂,可以怡情,作阅读快餐:亦可移情,挫折.抑郁时,疗效直逼“打鸡血”.这也是“心灵鸡汤”风靡不衰的原因 ...

  8. [macOS开发.NET Core] 开篇 & 抉择 & 先利其器

    一直以来MacBook是大多数开发者的首选,无论是macOS的便利性,还是MBP的外观,更或者是为了装13,我一直认为一个开发者必须得拥有一部MBP.虽然最后的因素是大多数的. 终于在我的努力下说服下 ...

  9. 值得一看的35个Redis常用问题总结

    1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库 ...

  10. 使用Atlas进行元数据管理之Glossary(术语)

    背景:笔者和团队的小伙伴近期在进行数据治理/元数据管理方向的探索, 在接下来的系列文章中, 会陆续与读者们进行分享在此过程中踩过的坑和收获. 元数据管理系列文章: [0] - 使用Atlas进行元数据 ...