正解:树链剖分+线段树

解题报告:

传送门!

树链剖分+线段树算是基操了趴,,,

就无脑码码码,没有任何含金量,不需要动脑子,然后码量其实也不大,就很爽

比树剖的板子还要板子一些hhhhh

放下代码就欧克了QwQ

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define il inline
  4. #define int long long
  5. #define gc getchar()
  6. #define ls(x) (x<<1)
  7. #define rs(x) ((x<<1)|1)
  8. #define t(i) edge[i].to
  9. #define w(i) edge[i].wei
  10. #define fy(i) edge[i].fy
  11. #define ri register int
  12. #define rb register bool
  13. #define rc register char
  14. #define rp(i,x,y) for(ri i=x;i<=y;++i)
  15. #define my(i,x,y) for(ri i=x;i>=y;--i)
  16. #define e(i,x) for(ri i=head[x];i;i=edge[i].nxt)
  17.  
  18. +;
  19. int n,q,ed_cnt,head[N],fa[N],top[N],sz[N],sn[N],dfn[N],low[N],rk[N],dfn_cnt,val[N];
  20. struct ed{int to,nxt;}edge[N];
  21. struct node{int dat,tag;}tr[N];
  22.  
  23. il int read()
  24. {
  25. rc ch=gc;ri x=;rb y=;
  26. '))ch=gc;
  27. ;
  28. )+(x<<)+(ch^'),ch=gc;
  29. return y?x:-x;
  30. }
  31. il char rd(){rc ch=gc;while(ch!='C' && ch!='Q')ch=gc;return ch;}
  32. il void ad(ri x,ri y){edge[++ed_cnt]=(ed){x,head[y]};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x]};head[x]=ed_cnt;}
  33. ;fa[x]=fat;e(i,x)if(t(i)^fat){dfs1(t(i),x),sz[x]+=sz[t(i)];if(sz[t(i)]>sz[sn[x]] || !sz[x])sn[x]=t(i);}}
  34. void dfs2(ri x,ri tp)
  35. {
  36. top[x]=tp;rk[dfn[x]=low[x]=++dfn_cnt]=x;if(sn[x])dfs2(sn[x],tp);low[x]=max(low[x],low[sn[x]]);
  37. e(i,x)if(t(i)^fa[x] && t(i)^sn[x])dfs2(t(i),t(i)),low[x]=low[t(i)];
  38. }
  39. il void pushdown(ri x,ri l,ri r)
  40. {
  41. if(tr[x].tag)
  42. {
  43. ri mid=(l+r)>>;
  44. tr[ls(x)].tag+=tr[x].tag;tr[ls(x)].dat+=tr[x].tag*(mid-l+);
  45. tr[rs(x)].tag+=tr[x].tag;tr[rs(x)].dat+=tr[x].tag*(r-mid);
  46. tr[x].tag=;
  47. }
  48. }
  49. il void pushup(ri x){tr[x].dat=tr[ls(x)].dat+tr[rs(x)].dat;}
  50. void build(ri x,ri l,ri r)
  51. {
  52. if(l==r){tr[x].dat=val[rk[l]];return;}
  53. ri mid=(l+r)>>;
  54. build(ls(x),l,mid);build(rs(x),mid+,r);
  55. pushup(x);
  56. }
  57. void modify(ri x,ri l,ri r,ri to_l,ri to_r,ri dat)
  58. {
  59. );return;}
  60. pushdown(x,l,r);
  61. ri mid=(l+r)>>;
  62. if(mid>=to_l)modify(ls(x),l,mid,to_l,to_r,dat);
  63. ,r,to_l,to_r,dat);
  64. pushup(x);
  65. }
  66. int query(ri x,ri l,ri r,ri to_l,ri to_r)
  67. {
  68. ;
  69. if(to_l<=l && r<=to_r)return tr[x].dat;
  70. pushdown(x,l,r);
  71. ri mid=(l+r)>>,ret=;
  72. if(mid>=to_l)ret+=query(ls(x),l,mid,to_l,to_r);
  73. ,r,to_l,to_r);
  74. return ret;
  75. }
  76. il ,,n,dfn[x],dfn[x],dat);}
  77. il ,,n,dfn[x],low[x],dat);}
  78. il ;,,n,dfn[top[x]],dfn[x]),x=fa[top[x]];return ret;}
  79.  
  80. main()
  81. {
  82. // freopen("3178.in","r",stdin);freopen("3178.out","w",stdout);
  83. n=read();q=read();rp(i,,n)val[i]=read();rp(i,,n-){ri x=read(),y=read();ad(x,y);}dfs1(,);dfs2(,);build(,,n);
  84. while(q--)
  85. {
  86. ri op=read();
  87. switch(op)
  88. {
  89. :{ri x=read(),a=read();modify_pre_sig(x,a);break;}
  90. :{ri x=read(),a=read();modify_pre(x,a);break;}
  91. :{ri x=read();printf("%lld\n",query_pre(x));break;}
  92. }
  93. }
  94. ;
  95. }

只会做做小水题安慰下自己了QAQ

洛谷P3178 树上操作 [HAOI2015] 树链剖分的更多相关文章

  1. Luogu P3178 树上操作(树链剖分+线段树)

    题意 见原题 题解 重链剖分模板题 #include <cstdio> #include <algorithm> using std::swap; typedef long l ...

  2. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  3. 洛谷p3384【模板】树链剖分题解

    洛谷p3384 [模板]树链剖分错误记录 首先感谢\(lfd\)在课上调了出来\(Orz\) \(1\).以后少写全局变量 \(2\).线段树递归的时候最好把左右区间一起传 \(3\).写\(dfs\ ...

  4. 洛谷P3178 [HAOI2015]树上操作 题解 树链剖分+线段树

    题目链接:https://www.luogu.org/problem/P3178 这道题目是一道树链剖分的模板题. 但是在解决这道问题的同事刷新了我的两个认识: 第一个认识是:树链剖分不光可以处理链, ...

  5. [HAOI2015]树上操作(树链剖分)

    [HAOI2015]树上操作(luogu) Description 题目描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个操作,分为三种: 操作 1 :把某个节点 x 的点权增 ...

  6. BZOJ_4034 [HAOI2015]树上操作 【树链剖分dfs序+线段树】

    一 题目 [HAOI2015]树上操作 二 分析 树链剖分的题,这里主要用到了$dfs$序,这题比较简单的就是不用求$lca$. 1.和树链剖分一样,先用邻接链表建双向图. 2.跑两遍$dfs$,其实 ...

  7. 【HAOI2015】树上操作(树链剖分)

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

  8. BZOJ 4034 [HAOI2015]树上操作(树链剖分)

    题目链接  BZOJ4034 这道题树链剖分其实就可以了. 单点更新没问题. 相当于更新 [f[x], f[x]]这个区间. f[x]表示树链剖分之后每个点的新的标号. 区间更新的话类似DFS序,求出 ...

  9. 洛谷 P3384 【模板】树链剖分

    树链剖分 将一棵树的每个节点到它所有子节点中子树和(所包含的点的个数)最大的那个子节点的这条边标记为"重边". 将其他的边标记为"轻边". 若果一个非根节点的子 ...

随机推荐

  1. 【C#】C#线程_I/O限制的异步操作

    目录结构: contents structure [+] 为什么需要异步IO操作 C#的异步函数 async和await的使用 async和Task的区别 异步函数的状态机 异步函数如何转化为状态机 ...

  2. Renascence架构介绍——文件夹

    这一系列文章是为个人项目作一个介绍.有兴趣的朋友能够关注一下. https://github.com/jxt1234/Renascence 先写个文件夹.以后按文件夹更新 1.自己主动编程体系设想 2 ...

  3. 小白都能看明白的VLAN原理解释

    为什么需要VLAN 1. 什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.VLAN ...

  4. d3绘制饼状图

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Mac 开发必备 利器 iterm2 oh-my-zsh

    推荐终端神器 iterm2 以及 oh-my-zsh,可以研究一下怎么用,好的开发环境是可以提高效率的,以及alias 的使用. https://www.zhihu.com/question/2744 ...

  6. 【iCore4 双核心板_uC/OS-II】例程五:信号量——共享资源

    一.实验说明: 信号量是操作系统中的一类事件,是实现任务间通信的一个中间环节.当系统中的多个任务 在运行时,经常需要互相无冲突地访问同一个资源,或者需要互相支持的依赖,甚至有时还要互 相加以必要的限制 ...

  7. .net Core Abp See config settings - "CustomSchemaIds" for a workaround

    Swagger  See config settings - "CustomSchemaIds" for a workaround System.InvalidOperationE ...

  8. windows上RSA密钥生成和使用

    一,下载安装windows平台openssl密钥生成工具,执行安装目录bin下的"openssl.exe",执行后弹出命令窗口如下 运行 二,生成私钥 输入"genrsa ...

  9. Python PIL 的image类和numpy array之间的互换

    import cv2 import numpy as np from PIL import Image from PIL import ImageEnhance def getline(frame): ...

  10. hdoj:2061

    #include <iostream> #include <string> using namespace std; int main() { int n,k; double ...