题意略。

思路:

将树上的节点编好dfs序,然后就可以用树状数组区间修改点查询了。

我们用 lft[v] 和 rht[v]来表示v的子树在dfs序中的左端和右端,这样才方便我们对树状数组的操作。

其实这个题目的问题在于每个点在修改时,修改的值不是一定的,会发生变化。

我是将加上的值和减去的值分开了。

开两个树状数组,一个记录加:在我们进行加操作的时候,加上的值是x + deep[v] * k。

一个记录减:在我们进行减操作的时候,减去的值就是k。

最后在获取答案的时候,ans = sum(v,0) - deep[v] * sum(v,1)。

详见代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 3e5 + ;
const LL mod = 1e9 + ; int lft[maxn],rht[maxn],n,q,cnt;
LL deep[maxn],BIT[][maxn];
vector<int> graph[maxn]; void dfs(int cur,int d){
lft[cur] = ++cnt;
deep[cur] = d;
for(int i = ;i < graph[cur].size();++i){
int v = graph[cur][i];
dfs(v,d + );
}
rht[cur] = cnt;
}
int lowbit(int k){
return (k & -k);
}
void add(int pos,LL val,int idx){
while(pos <= n){
BIT[idx][pos] += val;
BIT[idx][pos] %= mod;
pos += lowbit(pos);
}
}
LL sum(int pos,int idx){
LL ret = ;
while(pos > ){
ret += BIT[idx][pos];
pos -= lowbit(pos);
ret %= mod;
}
return ret;
} int main(){
scanf("%d",&n);
int pi;
for(int i = ;i <= n;++i){
scanf("%d",&pi);
graph[pi].push_back(i);
}
dfs(,);
scanf("%d",&q);
for(int i = ;i < q;++i){
int type;
scanf("%d",&type);
if(type == ){
int v;
LL x,k;
scanf("%d%lld%lld",&v,&x,&k);
LL val = (x + deep[v] * k) % mod;
add(lft[v],val,);
add(rht[v] + ,-val,);
add(lft[v],k,);
add(rht[v] + ,-k,);
}
else{
int v;
scanf("%d",&v);
int pos = lft[v];
LL part1 = sum(pos,);
LL part2 = sum(pos,);
part2 = part2 * deep[v] % mod;
LL ans = ((part1 - part2) % mod + mod) % mod;
printf("%lld\n",ans);
}
}
return ;
}

Codeforces 396C的更多相关文章

  1. CodeForces 396C On Changing Tree

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

  2. CodeForces 396C 树状数组 + DFS

    本主题开始看到以为段树或树状数组,但是,对于一个节点的有疑问的所有子节点的加权,这一条件被视为树的根,像 然后1号是肯定在第一层中,然后建立一个单向侧倒查,然后记录下来 其中每个节点 层,终于 两个节 ...

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

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

  4. Codeforces 396C (DFS序+线段树)

    题面 传送门 题目大意: 给定一棵树,每个点都有权值,边的长度均为1,有两种操作 操作1:将节点u的值增加x,并且对于u的子树中的任意一个点v,将它的值增加x-dist(u,v)*k, dist(u, ...

  5. CDQ分治题目小结

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

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

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

  7. codeforces396C

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

  8. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  9. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

随机推荐

  1. 《VR入门系列教程》之16---第一个OculusVR应用

    第一个VR应用    之前我们已经将Oculus的开发包导入到空工程中了,现在我们来构建第一个桌面VR的示例.开发包中已经有一个示例场景,只需要几步就可以让这个场景运行起来.我们将要构建的这个Demo ...

  2. java练习---13

    public class Y { public static void main(String[] args) { // TODO Auto-generated method stub new Y() ...

  3. java练习---10

    package cn.zrjh; public class L { public int id; public String name; public int age; public String c ...

  4. asn1 学习笔记

    语法 定义 Name ::= type 定义一个名称为“Name”的元素 它是一个给定ASN.1类型“Type”的实例 MyName ::= IA5String //IA5String(类似于ASCI ...

  5. Eclipse "R cannot be resolved"问题

    前两天 Eclipse 又遇到了这个问题.网上找了不少,不过最终还是没能解决我的问题,无奈重装了 Eclipse…… 搜索中找到了下面这几篇文章,常见的解决方法都在这里,还是不错的,分享一下: htt ...

  6. 对ThreadLocal的一些理解

    ThreadLocal也是在面试过程中经常被问到的,本文主要从以下三个方面来谈对ThreadLocal的一些理解: ThreadLocal用在什么地方 ThreadLocal一些细节 ThreadLo ...

  7. Centos7 搭建owncloud云存储

    Centos7 搭建owncloud云存储 首先准备必要的软件和资料. 这里我已经整理好了: 百度云共享 不过最好还是自己去官网上下.这里只不过是提供了快捷方式. owncloud官网:https:/ ...

  8. Java 设置PDF文档浏览偏好

    在查看PDF文档时,可进行一些浏览偏好设置,例如是否全屏浏览.隐藏或显示菜单栏/工具栏.设置页面布局模式等,下面将通过Java编程的方式来演示如何设置. 使用工具: Free Spire.PDF fo ...

  9. commons-logging + log4j源码分析

    分析之前先理清楚几个概念 Log4J = Log For Java SLF4J = Simple Logging Facade for Java 看到Facade首先想到的就是设计模式中的门面(Fac ...

  10. Keil5调试过程中遇到的一些警告和错误

    最近用keil5调试代码出了一些警告与错误,整理如下: 1.warning: #1295-D: Deprecated declaration run_c - give arg types void r ...