题意

有一颗有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了,一会再改,感觉没啥毛病哇

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <iostream>
 5 #include <vector>
 6 using namespace std;
 7 typedef long long LL;
 8
 9 const int maxn=300000+100;
10 const int MOD=1000000007;
11 int n,T,q,num ;
12 vector<int>child[maxn];
13 LL a[maxn],r[maxn],dep[maxn],val[maxn];
14 void dfs(LL u){
15     num++;
16     a[num]=u;
17     for(int i=0;i<child[u].size();i++){
18         int v=child[u][i];
19         dep[v]=dep[u]+1;
20         dfs(v);
21     }
22     r[u]=a[num];
23     return ;
24 }
25 LL addv[4*maxn],kv[4*maxn];
26 int ql,qr;
27 LL v,k;
28
29 void update(int o,int L,int R){
30     if(ql<=L&&qr>=R){
31         addv[o]=(add[o]%MOD+v%MOD)%MOD;
32         kv[o]=(kv[o]%MOD+k%MOD)MOD;
33         return;
34     }
35     int M=L+(R-L)/2;
36     if(ql<=M)
37        update(2*o,L,M);
38     if(qr>M)
39        update(2*o+1,M+1,R);
40     return;
41 }
42 //找到v的值
43 LL query(int o,int L,int R,LL adv,LL adk){
44     if(L==R){
45         return addv[o]+adv-dep[val[L]]*(kv[o]+adk);
46     }
47     int M=L+(R-L)/2;
48     if(v<=M)
49         return query(2*o,L,M,(adv%MOD+addv[o]%MOD)%MOD,(adk+kv[o])%MOD);
50     if(v>M)
51         return query(2*o+1,M+1,R,(adv%MOD+addv[o]%MOD)%MOD,(adk%MOD+kv[o]%MOD)%MOD);
52 }
53 int main(){
54     scanf("%d",&T);
55     for(int t=1;t<=T;t++){
56         scanf("%d",&n);
57         for(int i=1;i<=n;i++)child[i].clear();
58         num=0;
59         for(int i=2;i<=n;i++){
60             int x;
61             scanf("%d",&x);
62             child[x].push_back(i);
63         }
64         dep[1]=1;
65         dfs(1);
66         for(int i=1;i<=n;i++)val[a[i]]=i;
67         memset(addv,0,sizeof(addv));
68         memset(kv,0,sizeof(kv));
69         scanf("%d",&q);
70         for(int i=1;i<=q;i++){
71             int ty;
72             scanf("%d",&ty);
73             if(ty==1){
74                int vv;
75                LL x;
76                scanf("%d%lld%lld",&vv,&x,&k);
77                ql=a[vv],qr=r[vv],v=x+dep[vv]*k;
78               // cout<<ql<<" "<<qr<<endl;
79                update(1,1,n);
80             }else{
81                 int vv;
82                 scanf("%d",&vv);
83                 v=a[vv];
84                 cout<<query(1,1,n,0,0)%MOD<<endl;
85             }
86         }
87
88        /* for(int i=1;i<=num;i++)
89             printf("%d ",a[i]);
90         printf("\n");
91         for(int i=1;i<=n;i++){
92             printf("%d %d\n",i,r[i]);
93         }*/
94     }
95 return 0;
96 }

View Code

转载于:https://www.cnblogs.com/LQLlulu/p/8955429.html

【FZU 2277】Change相关推荐

  1. 【 FZU - 2214 】Knapsack problem(逆向0-1背包)

    题干: Given a set of n items, each with a weight w[i] and a value v[i], determine a way to choose the ...

  2. 【FZU - 2039】Pets(二分图匹配,水题)

    题干: 有n个人,m条狗,然后会给出有一些人不喜欢一些狗就不会购买,问最多能卖多少狗.. Input There is a single integer T in the first line of ...

  3. 【FZU - 2202】犯罪嫌疑人(思维,假装建图,分类讨论)

    题干: 福尔摩斯是个大侦探,他总是在解决疑难案件.这一次的案件也不例外,案件是这样的:有编号为1到N的N位嫌疑犯,他们其中有一个犯了罪,然后每个嫌疑犯都被询问,"哪一个人犯了罪?" ...

  4. 【FZU - 2254】英语考试(最小生成树,思维,建图)

    题干: 在过三个礼拜,YellowStar有一场专业英语考试,因此它必须着手开始复习. 这天,YellowStar准备了n个需要背的单词,每个单词的长度均为m. YellowSatr准备采用联想记忆法 ...

  5. 【FZU - 1759】Super A^B mod C (数论,快速幂,快速乘,欧拉降幂,指数循环节,模板)

    题干: Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1&l ...

  6. 【FZU - 2140 】Forever 0.5 (计算几何,构造)

    题干: Given an integer N, your task is to judge whether there exist N points in the plane such that sa ...

  7. 【nyoj - 860】 又见0-1背包 (dp,反向0-1背包,好题好思路)

    题干: 又见01背包 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 输入 多组测试数据. 每组测试数据第一行输入,n 和 W ,接下来有n行,每行输入两个数,代表第i个物品的 ...

  8. 【整理归纳】Linux中文件的Access,Modify,Change区别

    [整理归纳]Linux中文件的Access,Modify,Change区别 Access\Modify\Change的初始时间记录都是文件被创建的时间 Access 指最后一次读取的时间(访问) Mo ...

  9. 【论文笔记】Crop phenotyping in a context of Global Change: what to measure and how to do it

    [论文笔记]Crop phenotyping in a context of Global Change: what to measure and how to do it 全球变化背景下的作物表型: ...

  10. 【FZU】Problem 2181 快来买肉松饼 点双连通

    传送门:[FZU]Problem 2181 快来买肉松饼 题目分析:无向图找奇圈的问题.首先我们做tarjan求出点双连通块,每一个块中用黑白染色法得到最长的奇圈,然后这个奇圈中不参加游戏的小孩就是这 ...

最新文章

  1. Linux下php5.3编译oracle客户端
  2. 日常运维管理技巧十五(htop使用说明top增强版)(转载)
  3. SAP Analytics Cloud里的Planning model
  4. 摄像头自动曝光相关基础知识
  5. 大脑比机器智能_机器大脑的第一步
  6. js中的时间与毫秒数互相转换,倒计时
  7. springboot搞定全局自定义异常
  8. flutter 发布release版的流程(android)
  9. Redis脚本插件之————执行Lua脚本示例
  10. 僵尸粉检测 php,微信新功能,一键检测你的手机卡不卡,还能查僵尸粉
  11. JavaScript判断数组中是否包含某个值?
  12. 超高精度UWB其实并不贵——UWB定位基站成本详解
  13. MySQL数据库的完美卸载
  14. [unity2D] 迷你拼图
  15. 简单学JAVA-Java学习方法-费曼学习法
  16. 1、关于douyin 小红书等平台 人均985 211的想法
  17. PHP+JS+HTML 手机下拉加载分页
  18. L1-040 最佳情侣身高差
  19. ctfshow 做题 萌新 模块(3)
  20. 经验总结 黑客入侵网络的50种方法2

热门文章

  1. ggplot2图集汇总(一)
  2. 整洁数据 —tidytext(一)
  3. Practical Node.js摘录(2018版)第1,2章。
  4. LINUX修改path环境变量
  5. PIC16F877A开发板 数码管计数器实验
  6. 令仔代码收藏系列(二)----BASE64编码
  7. sessionStorage第一次进入页面显示弹窗
  8. java socket - 传递对象
  9. 参加香港亚洲秋季电子展经验点滴拾遗
  10. 域名解析与邮件服务器收发问题