题意略。

思路:

将树上的节点编好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 ;
}

最新文章

  1. C#远程时间同步助手软件设计
  2. Js 常用函数
  3. HTML - DOCTYPE
  4. 常用js总结1
  5. [渣译文] 使用 MVC 5 的 EF6 Code First 入门 系列:为ASP.NET MVC应用程序使用异步及存储过程
  6. [工具类]DataTable与泛型集合List互转
  7. gvim设置成不备份文件
  8. Entity Framework 学习初级篇--EntityClient(转)
  9. 【转】Linux Kernel __setup(str, fn)解析
  10. MultiMap
  11. 【PHP】linux搭建PHP运行环境
  12. 30 分钟 Java Lambda 入门教程
  13. MVC4网站发布到windows server 2003服务器
  14. oracle学习----行级锁的理解
  15. Mqtt协议IOS移植完1
  16. WebApi路由及版本控制
  17. MyBatis SQL配置文件中使用#{}取值为null时却不报错的解决方案。
  18. SpringMVC源码情操陶冶-ViewResolver视图解析
  19. 05_Javascript进阶第一天
  20. Linux grep命令分析以及C语言版本的实现

热门文章

  1. ssh,公钥和私钥,远程复制
  2. HTTP_3_HTTP报文
  3. TestNG中DataProvider的用法一
  4. 【未解决】iOS QBImagePickerController访问相册没有取消和确定按钮
  5. 创建软RAID5
  6. 作为前端的你,CC游戏开发可以上车
  7. GitHub项目:jkrasnay/sqlbuilder的使用
  8. Docker 核心技术
  9. 章节十五、9-自定义Loggers
  10. lnmp环境搭建方法