题意

有一颗有n个节点的有根树,根节点编号时1,每个结点都有一个值ai,开始的时候,所有节点的值都是0.

我们有q个操作,操作只有两种类型

1 v x k,a[v]+=x,a[v']+=x-k,a[v"]+=x-2*k... v'是结点v的孩子 。

2 v 输出a[v]mod 1e9+7。

分析

dfs序+线段树

下面的代码TLE了,一会再改,感觉没啥毛病哇

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
typedef long long LL; const int maxn=+;
const int MOD=;
int n,T,q,num ;
vector<int>child[maxn];
LL a[maxn],r[maxn],dep[maxn],val[maxn];
void dfs(LL u){
num++;
a[num]=u;
for(int i=;i<child[u].size();i++){
int v=child[u][i];
dep[v]=dep[u]+;
dfs(v);
}
r[u]=a[num];
return ;
}
LL addv[*maxn],kv[*maxn];
int ql,qr;
LL v,k; void update(int o,int L,int R){
if(ql<=L&&qr>=R){
addv[o]=(add[o]%MOD+v%MOD)%MOD;
kv[o]=(kv[o]%MOD+k%MOD)MOD;
return;
}
int M=L+(R-L)/;
if(ql<=M)
update(*o,L,M);
if(qr>M)
update(*o+,M+,R);
return;
}
//找到v的值
LL query(int o,int L,int R,LL adv,LL adk){
if(L==R){
return addv[o]+adv-dep[val[L]]*(kv[o]+adk);
}
int M=L+(R-L)/;
if(v<=M)
return query(*o,L,M,(adv%MOD+addv[o]%MOD)%MOD,(adk+kv[o])%MOD);
if(v>M)
return query(*o+,M+,R,(adv%MOD+addv[o]%MOD)%MOD,(adk%MOD+kv[o]%MOD)%MOD);
}
int main(){
scanf("%d",&T);
for(int t=;t<=T;t++){
scanf("%d",&n);
for(int i=;i<=n;i++)child[i].clear();
num=;
for(int i=;i<=n;i++){
int x;
scanf("%d",&x);
child[x].push_back(i);
}
dep[]=;
dfs();
for(int i=;i<=n;i++)val[a[i]]=i;
memset(addv,,sizeof(addv));
memset(kv,,sizeof(kv));
scanf("%d",&q);
for(int i=;i<=q;i++){
int ty;
scanf("%d",&ty);
if(ty==){
int vv;
LL x;
scanf("%d%lld%lld",&vv,&x,&k);
ql=a[vv],qr=r[vv],v=x+dep[vv]*k;
// cout<<ql<<" "<<qr<<endl;
update(,,n);
}else{
int vv;
scanf("%d",&vv);
v=a[vv];
cout<<query(,,n,,)%MOD<<endl;
}
} /* for(int i=1;i<=num;i++)
printf("%d ",a[i]);
printf("\n");
for(int i=1;i<=n;i++){
printf("%d %d\n",i,r[i]);
}*/
}
return ;
}

最新文章

  1. 通用js函数集锦&lt;来源于网络/自己&gt; 【一】
  2. knockoutJS学习笔记05:控制文本和外观绑定
  3. asp.net“服务器应用程序不可用” 解决方法
  4. angular 自定义指令 link or controller
  5. RxJava + Retrofit 的实际应用场景
  6. swappiness
  7. Tensorflow (1)
  8. laravel 添加第三方扩展库
  9. 手动添加git到目录右键菜单
  10. Android onSaveInstanceState和onRestoreInstanceState()
  11. Android性能优化之Listview(ViewHolder重用机制)
  12. linux下shell中执行命令的顺序问题
  13. YUI Compressor
  14. Android Studio下jni应用
  15. Thinkphp3.2+PHPQRCode 二维码生成示例
  16. iOS.mach_absolute_time
  17. AEAI DP创建弹窗
  18. (转)C#中的Predicate&lt;T&gt;与Func&lt;T, bool&gt;
  19. angular学习笔记(十四)-$watch(3)
  20. Tornado源码分析 --- Redirect重定向

热门文章

  1. [置顶] Android 关于ToolBar分分钟玩死自己?
  2. Mongodb 的劣势
  3. L3-008 喊山 (30 分)
  4. CALayer 实现的动画效果(一)
  5. LeetCode Valid Triangle Number
  6. Spring IOC容器的初始化-(二)BeanDefinition的载入和解析
  7. datetimebox
  8. Jmeter ----关于上传图片接口
  9. python学习之logging
  10. 在PHP中对查询出得数据库数据进行json编码