dfs序(注意出栈时也要加入),然后对于每一次一个节点的修改,都在左端点上打+x,右端点上打-x,区间修改同理(因此要用线段树且需要维护区间左端点数量-右端点数量)。对于询问操作,就是dfs序上的一段前缀和,用线段树处理即可。

 1 #include<cstdio>
 2 #include<cstring>
 3 #define ll long long
 4 #define maxN 100001
 5 #define L (k<<1)
 6 #define R ((k<<1)+1)
 7 #define mid ((l+r)>>1)
 8 struct ji{
 9     int next,to;
10 }edge[maxN<<1];
11 struct node{
12     ll k,s,lazy;
13 }f[maxN<<4];
14 ll E,n,m,x,y,a[maxN],head[maxN],l[maxN],r[maxN];
15 bool vis[maxN<<1];
16 void init(){
17     E=0;
18     memset(head,-1,sizeof(head));
19 }
20 void add(int x,int y){
21     edge[E].next=head[x];
22     edge[E].to=y;
23     head[x]=E++;
24 }
25 void up(int k){
26     f[k].k=f[L].k+f[R].k+f[k].lazy*(f[k].s=f[L].s+f[R].s);
27 }
28 void down(int k){
29     f[L].lazy+=f[k].lazy;
30     f[L].k+=f[k].lazy*f[L].s;
31     f[R].lazy+=f[k].lazy;
32     f[R].k+=f[k].lazy*f[R].s;
33     f[k].lazy=0;
34 }
35 void update(int k,int l,int r,int x,int y,int z){
36     if ((r<x)||(l>y))return;
37     if ((x<=l)&&(r<=y)){
38         if (l==r)
39             if (vis[l])f[k].s=1;
40             else f[k].s=-1;
41         f[k].k+=f[k].s*z;
42         f[k].lazy+=z;
43         return;
44     }
45     update(L,l,mid,x,y,z);
46     update(R,mid+1,r,x,y,z);
47     up(k);
48 }
49 ll query(int k,int l,int r,int x,int y){
50     if ((l>y)||(r<x))return 0;
51     if ((x<=l)&&(y>=r))return f[k].k;
52     down(k);
53     return query(L,l,mid,x,y)+query(R,mid+1,r,x,y);
54 }
55 void dfs(int k,int f){
56     vis[l[k]=++x]=true;
57     for(int i=head[k];i!=-1;i=edge[i].next)
58         if (edge[i].to!=f)dfs(edge[i].to,k);
59     r[k]=++x;
60 }
61 int main(){
62     int p;
63     init();
64     scanf("%lld%lld",&n,&m);
65     for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
66     for(int i=1;i<n;i++){
67         scanf("%lld%lld",&x,&y);
68         add(x,y);
69         add(y,x);
70     }
71     x=0;
72     dfs(1,0);
73     for(int i=1;i<=n;i++){
74         update(1,1,2*n,l[i],l[i],a[i]);
75         update(1,1,2*n,r[i],r[i],a[i]);
76     }
77     n*=2;
78     for(int i=1;i<=m;i++){
79         scanf("%d%lld",&p,&x);
80         if (p<3)scanf("%lld",&y);
81         if (p==1){
82             update(1,1,n,l[x],l[x],y);
83             update(1,1,n,r[x],r[x],y);
84         }
85         if (p==2)update(1,1,n,l[x],r[x],y);
86         if (p==3)printf("%lld\n",query(1,1,n,1,l[x]));
87     }
88 }

View Code

转载于:https://www.cnblogs.com/PYWBKTDA/p/11249921.html

[bzoj4034]树上操作相关推荐

  1. BZOJ4034 树上操作

    目录 BZOJ4034 树上操作 题解 code BZOJ4034 树上操作 题目传送门 题解 裸的树剖,写的时候注意细节即可. code #include <bits/stdc++.h> ...

  2. BZOJ4034 树上操作(树剖 线段树大模板)

    BZOJ4034 long long 是大坑点 貌似long long 跟int 乘起来会搞事情?... A了这题线段树和树剖的基础OK 嘛 重点过掉的还是线段树区间更新的lazy tag吧 #inc ...

  3. P3178 [HAOI2015]树上操作

    P3178 [HAOI2015]树上操作 题意: 题解: 这已经是很裸的树链剖分了... 直接套模板 代码: #include<cmath> #include<cstdio> ...

  4. BZOJ 4043 [HAOI2015]树上操作 dfs序 线段树

    $ \Rightarrow $ 戳我进BZOJ原题 $ \Rightarrow $ 戳我进洛谷原题 [HAOI2015]树上操作 Time Limit: 10 Sec Memory Limit: 25 ...

  5. bzoj 4034: [HAOI2015]树上操作(树链剖分+线段树区间更新)

    4034: [HAOI2015]树上操作 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 4981  Solved: 1603 [Submit][St ...

  6. bzoj4034: [HAOI2015]树上操作

    这题其实就是树剖裸题啊. 然后毒瘤选手由于上题树剖被卡到哭所以选择dfs序+树状数组. 不得不说简单的算法做出来更加难思考.然后网上的dalao们都一笔带过净说什么用两个树状数组维护就可以啦. 经过大 ...

  7. [HAOI2015]树上操作

    题目大意: 给你一棵n个点的树,以1为根,每个点都有一个点权,要求进行如下操作: 1.将x这个点的点权加上a: 2.将以x这个点为根的子树中每个点的点权加上a: 3.查询从x到根的路径的点权和. 思路 ...

  8. COJ 1008 WZJ的数据结构(八) 树上操作

    传送门:http://oj.cnuschool.org.cn/oj/home/problem.htm?problemID=986 WZJ的数据结构(八) 难度级别:E: 运行时间限制:3000ms: ...

  9. [BZOJ 4034][HAOI2015]树上操作(欧拉序列+线段树)

    Description 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中 ...

最新文章

  1. 从一起丢包故障来谈谈 nginx 中的 tcp keep-alive
  2. vimdiff使用总结
  3. 跨服务器Session共享的四种方法
  4. 工业物联网发展环境加速形成 中国企业如何突围?
  5. 第2章 Python 数字图像处理(DIP) --数字图像基础3 - 图像内插 - 最近邻内插 - 双线性插值 - 双三次内插 - 图像放大
  6. java 根据客户端重定向_JavaWeb【1.4HttpServletResponse类、重定向】
  7. Nginx核心原理揭秘:Nginx为什么高效?
  8. java8中的接口与时间操作
  9. Apache Flink Meetup 8.7 深圳站改为线上
  10. mysql 中时间和日期函数应用
  11. 苹果电脑拷贝文件到u盘很慢_小米最硬核U盘!20g,3.1接口,120MB/S读取速度,可连iphone华为...
  12. IT编程宝园资料分享
  13. linux中把程序启到前台,Linux程序前台后台切换
  14. SpringBoot下载Excel文件,在Wps上可以打开但是Office上的excel打不开的问题
  15. sketch常用快捷键键盘对应
  16. sx1278lora模块的常见问题解答
  17. VsCode新建VueJs项目
  18. 日本亚马逊海淘转运公司好?日亚转运公司攻略
  19. 一行Python都可以做什么?这35行看懂十行就算入门,全能看懂必是高手
  20. 恋前体检!您接受吗?

热门文章

  1. 网络流题目详讲+题单(提高版)(持续更新中......)
  2. Mysql 索引的基础(下)
  3. linq to sql简单使用
  4. SQLServer禁用、启用外键约束
  5. 玩转html5(五)---月球绕着地球转,地球绕着太阳转(canvas实现,同样可以动哦)...
  6. 【转】Service深入分析
  7. KillTimer析构函数
  8. 让ModalPopupExtender的控制控件能响应服务器事件
  9. 4 系统的 CPU 使用率很高,但为啥却找不到高 CPU的应用?
  10. android记账软件开发源代码_如何开发直播软件?直播软件开发的具体流程有哪些?...