思路:

先搞出来每个点的DFS序 (要有入栈和出栈两种状态的)

处理出来 线段树区间有多少入栈的和多少出栈的

加区间的时候就加(入-出)*wei

查前缀和

  1. //By SiriusRen
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6. #define N 200050
  7. #define int long long
  8. int n,m,Wei[N],v[N],first[N],next[N],tot,start[N],end[N],cnt;
  9. int xx,yy,ww,op,tree[N*20],mark[N*20],marka[N*20],vv[N];
  10. void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
  11. void dfs(int x,int fa){
  12. start[x]=++cnt;vv[cnt]=1;
  13. for(int i=first[x];~i;i=next[i])
  14. if(v[i]!=fa)
  15. dfs(v[i],x);
  16. end[x]=++cnt;vv[cnt]=-1;
  17. }
  18. void push_down(int pos){
  19. int lson=pos<<1,rson=pos<<1|1;
  20. tree[lson]+=mark[lson]*marka[pos];
  21. tree[rson]+=mark[rson]*marka[pos];
  22. marka[lson]+=marka[pos];
  23. marka[rson]+=marka[pos];
  24. marka[pos]=0;
  25. }
  26. void build(int l,int r,int pos){
  27. if(l==r){mark[pos]=vv[l];return;}
  28. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  29. build(l,mid,lson),build(mid+1,r,rson);
  30. mark[pos]=mark[lson]+mark[rson];
  31. }
  32. void insert(int l,int r,int pos,int wei,int x){
  33. if(l==r){tree[pos]+=wei;return;}
  34. if(marka[pos])push_down(pos);
  35. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  36. if(mid<x)insert(mid+1,r,rson,wei,x);
  37. else insert(l,mid,lson,wei,x);
  38. tree[pos]=tree[lson]+tree[rson];
  39. }
  40. int query(int l,int r,int pos,int x){
  41. if(r<=x){return tree[pos];}
  42. if(marka[pos])push_down(pos);
  43. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  44. if(mid>=x)return query(l,mid,lson,x);
  45. else return query(l,mid,lson,x)+query(mid+1,r,rson,x);
  46. }
  47. void Change(int l,int r,int pos){
  48. if(l>=xx&&r<=yy){
  49. marka[pos]+=ww;
  50. tree[pos]+=ww*mark[pos];
  51. return;
  52. }
  53. if(marka[pos])push_down(pos);
  54. int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
  55. if(mid<xx)Change(mid+1,r,rson);
  56. else if(mid>=yy)Change(l,mid,lson);
  57. else Change(l,mid,lson),Change(mid+1,r,rson);
  58. tree[pos]=tree[lson]+tree[rson];
  59. }
  60. signed main(){
  61. memset(first,-1,sizeof(first));
  62. scanf("%lld%lld",&n,&m);
  63. for(int i=1;i<=n;i++)scanf("%lld",&Wei[i]);
  64. for(int i=1;i<n;i++)
  65. scanf("%lld%lld",&xx,&yy),add(xx,yy),add(yy,xx);
  66. dfs(1,-1);
  67. build(1,cnt,1);
  68. for(int i=1;i<=n;i++)
  69. insert(1,cnt,1,Wei[i],start[i]),insert(1,cnt,1,-Wei[i],end[i]);
  70. for(int i=1;i<=m;i++){
  71. scanf("%lld",&op);
  72. if(op==1){
  73. scanf("%lld%lld",&xx,&ww);
  74. insert(1,cnt,1,ww,start[xx]);
  75. insert(1,cnt,1,-ww,end[xx]);
  76. }
  77. else if(op==2){
  78. scanf("%lld%lld",&xx,&ww);
  79. yy=end[xx],xx=start[xx];
  80. Change(1,cnt,1);
  81. }
  82. else if(op==3){
  83. scanf("%lld",&xx);
  84. printf("%lld\n",query(1,cnt,1,start[xx]));
  85. }
  86. }
  87. }

BZOJ 4034 线段树+DFS序的更多相关文章

  1. Tsinsen A1505. 树(张闻涛) 倍增LCA,可持久化线段树,DFS序

    题目:http://www.tsinsen.com/A1505 A1505. 树(张闻涛) 时间限制:1.0s   内存限制:512.0MB    总提交次数:196   AC次数:65   平均分: ...

  2. BZOJ_3252_攻略_线段树+dfs序

    BZOJ_3252_攻略_线段树+dfs序 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏< ...

  3. 【XSY2534】【BZOJ4817】树点涂色 LCT 倍增 线段树 dfs序

    题目大意 ​ Bob有一棵\(n\)个点的有根树,其中\(1\)号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜 ...

  4. 【bzoj4817】树点涂色 LCT+线段树+dfs序

    Description Bob有一棵n个点的有根树,其中1号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同.定义一条路 径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...

  5. S - Query on a tree HDU - 3804 线段树+dfs序

    S - Query on a tree HDU - 3804   离散化+权值线段树 题目大意:给你一棵树,让你求这棵树上询问的点到根节点直接最大小于等于val的长度. 这个题目和之前写的那个给你一棵 ...

  6. HDU 5692 线段树+dfs序

    Snacks Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Sub ...

  7. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

  8. bzoj4034 线段树+dfs序

    https://www.lydsy.com/JudgeOnline/problem.php?id=4034 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 ...

  9. 【BZOJ-3306】树 线段树 + DFS序

    3306: 树 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 792  Solved: 262[Submit][Status][Discuss] De ...

随机推荐

  1. 启动bind时报none:0: open: /etc/named/named.conf: file not found

    刚一看,以为是说named.conf文件不存在或权限不够,但仔细查了一下后发现的确在啊,权限改为777也不行.无奈!先查了一下/etc/init.d/named文件里,是在执行/usr/local/n ...

  2. inux 虚拟机桥接模式 静态ip设置,桥接才是王道

    修改/etc/sysconfig/network-scripts  目录下的 ifcfg-eth0 [root@yangcb network-scripts]# cat ifcfg-eth0 DEVI ...

  3. HDU 4930 Fighting the Landlords(暴力枚举+模拟)

    HDU 4930 Fighting the Landlords 题目链接 题意:就是题中那几种牌型.假设先手能一步走完.或者一步让后手无法管上,就赢 思路:先枚举出两个人全部可能的牌型的最大值.然后再 ...

  4. SQL Server 2008 备份数据库

    1.打开SQL , 找到要备份的数据库 , 右键 >> 任务 >>备份 2.弹出 [ 备份数据库对话框 ] ,如图: 3.点击加入 [ button ] . 例如以下图: 4. ...

  5. 关于MAVEN找不到JDK的那点事

    自从SUN被Oracle收购以后.JDK就由Oracle来提供了. 在新版本号之中,假设你下载安装JDK以后,又选择了JRE安装(当然,如今JRE直接叫做Java了),那么,恭喜你,在 C:\wind ...

  6. HDOJ 4975 A simple Gaussian elimination problem.

    和HDOJ4888是一样的问题,最大流推断多解 1.把ISAP卡的根本出不来结果,仅仅能把全为0或者全为满流的给特判掉...... 2.在残量网络中找大于2的圈要用一种类似tarjian的方法从汇点開 ...

  7. [学习笔记]HTTP协议

    转自:www.cnblogs.com/li0803/archive/2008/11/03/1324746.html Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的协议,由于 ...

  8. BZOJ 3240 构造矩阵+矩阵快速幂

    思路: ax+b cx+d 构造矩阵+矩阵快速幂 (需要加各种特判,,,,我好像加少了- ) //By SiriusRen #include <cstdio> #include <c ...

  9. Metasploit学习笔记(博主推荐)

    不多说,直接上干货! 连接后台的数据库,当然不是必须品. 连接数据库的好处:1.可以攻击和扫描的结果,保存起来      2.将一些搜索结果做个缓存 默认数据库是postgresql. 同时要注意的是 ...

  10. GPU开发笔记(一)

    首先我想到的是把安装好的CUDA下的programdata里面的demo都找一找,看看有没有自己需要的demo程序. 然后去CSDN或者pudn上去找找开源的代码. 至于GITHUB还没找过. 其次是 ...