题意略。

思路:

将树上的节点编好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 + 5;
const LL mod = 1e9 + 7;int lft[maxn],rht[maxn],n,q,cnt;
LL deep[maxn],BIT[2][maxn];
vector<int> graph[maxn];void dfs(int cur,int d){lft[cur] = ++cnt;deep[cur] = d;for(int i = 0;i < graph[cur].size();++i){int v = graph[cur][i];dfs(v,d + 1);}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 = 0;while(pos > 0){ret += BIT[idx][pos];pos -= lowbit(pos);ret %= mod;}return ret;
}int main(){scanf("%d",&n);int pi;for(int i = 2;i <= n;++i){scanf("%d",&pi);graph[pi].push_back(i);}dfs(1,1);scanf("%d",&q);for(int i = 0;i < q;++i){int type;scanf("%d",&type);if(type == 1){int v;LL x,k;scanf("%d%lld%lld",&v,&x,&k);LL val = (x + deep[v] * k) % mod;add(lft[v],val,0);add(rht[v] + 1,-val,0);add(lft[v],k,1);add(rht[v] + 1,-k,1);}else{int v;scanf("%d",&v);int pos = lft[v];LL part1 = sum(pos,0);LL part2 = sum(pos,1);part2 = part2 * deep[v] % mod;LL ans = ((part1 - part2) % mod + mod) % mod;printf("%lld\n",ans);}}return 0;
}

转载于:https://www.cnblogs.com/tiberius/p/9409445.html

Codeforces 396C相关推荐

  1. CodeForces 396C 树状数组 + DFS

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

  2. CodeForces 375D Tree and Queries

    传送门:https://codeforces.com/problemset/problem/375/D 题意: 给你一颗有根树,树上每个节点都有其对应的颜色,有m次询问,每次问你以点v为父节点的子树内 ...

  3. 「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

    题意与分析(CodeForces 540D) 是一道概率dp题. 不过我没把它当dp做... 我就是凭着概率的直觉写的,还好这题不算难. 这题的重点在于考虑概率:他们喜相逢的概率是多少?考虑超几何分布 ...

  4. 【codeforces 812C】Sagheer and Nubian Market

    [题目链接]:http://codeforces.com/contest/812/problem/C [题意] 给你n个物品; 你可以选购k个物品;则 每个物品有一个基础价值; 然后还有一个附加价值; ...

  5. CodeForces 获得数据

    针对程序的输出可以看见 CodeForces :当输入.输出超过一定字符,会隐藏内容 所以:分若干个程序进行输入数据的获取 1. 1 for (i=1;i<=q;i++) 2 { 3 scanf ...

  6. codeforces水题100道 第二十七题 Codeforces Round #172 (Div. 2) A. Word Capitalization (strings)...

    题目链接:http://www.codeforces.com/problemset/problem/281/A 题意:将一个英文字母的首字母变成大写,然后输出. C++代码: #include < ...

  7. CodeForces 595A

    题目链接: http://codeforces.com/problemset/problem/595/A 题意: 一栋楼,有n层,每层有m户,每户有2个窗户,问这栋楼还有多少户没有睡觉(只要一个窗户灯 ...

  8. codeforces A. Jeff and Digits 解题报告

    题目链接:http://codeforces.com/problemset/problem/352/A 题目意思:给定一个只有0或5组成的序列,你要重新编排这个序列(当然你可以不取尽这些数字),使得这 ...

  9. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  10. Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈)

    Codeforces Round #417:E. FountainsSagheer and Apple Tree(树上博弈) 标签: codeforces 2017-06-02 11:41 29人阅读 ...

最新文章

  1. 安卓学习-性能最佳实战
  2. 9个杰出的免费 WordPress 主题
  3. EXT调用ASP.NET AJAX WebService
  4. vmbox下linux共享文件
  5. 客户主数据冻结与删除标记位汇总
  6. 图片 存_早安图片 早上好问候语 早上好祝福语录大全 早上好表情
  7. MySQL查询结果纵向输出标识符\G
  8. vmware 10使用心得记录
  9. ArcGIS Server .net Web ADF 体系结构
  10. 震撼!寒冬腊月里惊现多台历途外墙清洗机器人
  11. 网络信息安全及常见数据加密技术
  12. 三菱plc控制步进电机实例_自动化工程师必掌握的PLC控制步进电机逻辑思路
  13. 主板供电接口 图解安装详细过程
  14. OpenCV角点检测—Harris,SIFT,ORB(7)
  15. Unity——射线检测
  16. 计算机组成原理中CPI、MIPS、CPU执行时间、主频等计算
  17. 张国荣一生57部电影海报全集
  18. (二)立创EDA之新建工程,原理图,PCB
  19. Windows10 磁盘活动时间百分之百导致系统卡顿解决方法
  20. [Vjudge]卡片游戏

热门文章

  1. 垃圾收集器和内存分配
  2. [渝粤教育] 西南科技大学 物流信息系统 在线考试复习资料
  3. Pandas系列(十)Merge语法
  4. ubuntu下OpenPose的安装、使用、初步介绍
  5. linux环境下的c++编程
  6. linux-推荐两款好用的录屏软件
  7. sql-查询不同状态下的数据之和
  8. Phpstorm-php在线手册配置
  9. MySQL查询当天、本周,本月,上一个月的数据
  10. 关于SpringMVC注解