题目链接
以洛谷题为原题。看代码。
下面是模板代码(横线之外的为模板代码):

/*--------------------1.mchange(x, y, v)  树链更改(x,y)
2.mask(x, y)        树链查询(x,y)
3.achange(x, v)     子树更改x
4.aask(x)            子树查询x--------------------*/
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <cmath>
#define ll long long
using namespace std;
const int N = 1e5+5;
int he[N], ne[N<<1], ver[N<<1];
int dep[N], son[N], fa[N], id[N], tp[N], dfn[N],siz[N];
int n, m, cnt, tot = 1;
ll su[N], w[N];
/*----------------int root;
ll mod;----------------*/
struct Node
{int l, r;ll sum, add;
}tr[N<<2];
void add(int x, int y){ver[++tot] = y; ne[tot] = he[x]; he[x] = tot;}
int dfs1(int u, int f)
{fa[u] = f;dep[u] = dep[f]+1;siz[u] = 1;int mx = -1;for (int i = he[u]; i; i = ne[i]){int y = ver[i];if (y == f) continue;siz[u] += dfs1(y, u);if (siz[y] > mx){mx = siz[y]; son[u] = y;}}return siz[u];
}
void dfs2(int u, int t)
{dfn[u] = ++cnt;tp[u] = t;w[cnt] = su[u];if (!son[u])return;dfs2(son[u], t);for (int i = he[u]; i; i = ne[i]){int v = ver[i];if (v == fa[u] || v == son[u]) continue;dfs2(v,v);}
}
inline void update(int p, ll v)
{/*单点更改----------------------------------tr[p].sum = (tr[p].sum + v * (tr[p].r - tr[p].l + 1)%mod)%mod;tr[p].add = (tr[p].add + v) % mod;------------------------------------------*/
}
inline void pushup(int p)
{/*pushup------------------------------------tr[p].sum = (tr[p<<1].sum + tr[p<<1|1].sum) % mod;------------------------------------------*/
}
void spread(int p)
{/*pushdown----------------------------------if (!tr[p].add) return;int l = p<<1, r = p<<1|1;update(l, tr[p].add);update(r, tr[p].add);tr[p].add = 0;------------------------------------------*/
}
int mx =0;
void build(int p, int l, int r)
{mx = max(mx, p);tr[p].l = l; tr[p].r = r;tr[p].add = 0;if (l == r){tr[p].sum = w[l]; return;}int mid = (l + r) >> 1;build(p<<1, l, mid);build(p<<1|1, mid+1, r);pushup(p);
}
void change(int p, int l, int r, ll v)
{if (l <= tr[p].l && tr[p].r <= r){update(p, v); return;}spread(p);int mid = (tr[p].l + tr[p].r) >>1;if (l <= mid) change(p<<1, l, r, v);if (r > mid) change(p<<1|1, l, r, v);pushup(p);
}
ll ask(int p, int l, int r)
{if (l <= tr[p].l && tr[p].r <= r) return tr[p].sum%mod;spread(p);int mid = (tr[p].l + tr[p].r) >> 1;ll val = 0;if (l <= mid) val = (val + ask(p<<1, l, r))%mod;if (r > mid) val = (val + ask(p<<1|1, l, r))%mod;return val%mod;
}
void mchange(int x, int y, ll v)
{while(tp[x] != tp[y]){if (dep[tp[x]] < dep[tp[y]]) swap(x, y);change(1, dfn[tp[x]], dfn[x], v);x = fa[tp[x]];}if (dep[x] > dep[y]) swap(x, y);change(1, dfn[x], dfn[y], v);
}
ll mask(int x, int y)
{ll sum = 0;while(tp[x] != tp[y]){if (dep[tp[x]] < dep[tp[y]]) swap(x, y);/*-----------------------sum = (sum + ask(1, dfn[tp[x]], dfn[x]))%mod;-----------------------*/x = fa[tp[x]];}if (dep[x] > dep[y]) swap(x, y);/*--------------------------sum = (sum + ask(1, dfn[x], dfn[y]))%mod;--------------------------*/return sum;
}
ll aask(int x)
{return ask(1, dfn[x], dfn[x] + siz[x] - 1);
}
void achange(int x, ll v)
{change(1, dfn[x], dfn[x] + siz[x] - 1, v);
}
/*--Debug--------------------
void print()
{for (int i = 1; i <= n; i++)cout << ask(1, dfn[i], dfn[i]) << " ";cout << endl;
}
--------------------------*//*-----------------------------int main()
{scanf("%d%d%d%lld", &n, &m, &root, &mod);for (int i = 1; i <= n; i++)scanf("%lld", &su[i]), su[i]%=mod;for (int i = 1; i < n; i++){int x, y;scanf("%d%d", &x, &y);add(x, y);add(y, x);}------------------------*/dfs1(root, 0);dfs2(root, root);build(1, 1, n);/*-----------------------while(m--){int op, x, y;ll k;scanf("%d", &op);if (op == 1){scanf("%d%d%lld", &x, &y, &k);mchange(x, y, k);}else if (op == 2){scanf("%d%d", &x, &y);printf("%lld\n", mask(x, y)%mod);}else if (op == 3){scanf("%d%lld", &x, &k);achange(x, k);}else{scanf("%d", &x);printf("%lld\n", aask(x)%mod);}}return 0;
}
-------------------------*/

树链剖分 完全模板(子树查改+树链查改)相关推荐

  1. 树链剖分 讲解+模板+习题

    今天我们来讲一下树链剖分 树链剖分是什么? 树链剖分是一种用来维护树上路径信息的在线方法,可以处理在线. 通常通过一种方法,将一棵树剖分成若干条链,然后通过数据结构(线段树,BIT等)去维护. 我们通 ...

  2. CF #563 Div2 F. Ehab and the Big Finale //树链剖分(模板)+ 交互

    题意:给一颗树,和一个隐藏的节点x,在36次询问内求出x. 每次询问: 1.询问x到某一结点u的距离   2.某个节点u到x的路径上,得到u的儿子节点(u必须是x的祖先,否则WA). 思路: 首先处理 ...

  3. 树链剖分 or 根号分治 + dfs序 + 树状数组 ---- CF1254 D. Tree Queries

    题目链接 题目大意: 问题转化: 很容易发现:假设修改的节点是vvv. 1.vvv的子树sonvson_vsonv​直接加上(n−size[sonv])n×d\frac{(n-size[son_v]) ...

  4. 树剖+线段树||树链剖分||BZOJ1984||Luogu4315||月下“毛景树”

    题面:月下"毛景树" 题解:是道很裸的树剖,但处理的细节有点多(其实是自己线段树没学好).用一个Dfs把边权下移到点权,用E数组记录哪些边被用到了:前三个更新的操作都可以合并起来, ...

  5. 【luogu P3384 树链剖分】 模板

    题目链接:https://www.luogu.org/problemnew/show/P3384 诶又给自己留了个坑..不想写线段树一大理由之前的模板变量名太长 #include <cstdio ...

  6. 洛谷——P2590 [ZJOI2008]树的统计(树链剖分模板练手)

    P2590 [ZJOI2008]树的统计 I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问 ...

  7. 对LCA、树上倍增、树链剖分(重链剖分长链剖分)和LCT(Link-Cut Tree)的学习

    LCA what is LCA & what can LCA do LCA(Lowest Common Ancestors),即最近公共祖先 在一棵树上,两个节点的深度最浅的公共祖先就是 L ...

  8. 归纳(四):树链剖分

    剖分的意义 能用线段树搞想要的信息. (其实可以只用来求LCA) 需要的东西 七个数组,在两次dfs中处理出来. dfs1: dep[]:深度 fa[]:父亲 son[]:重儿子 siz[]:子树大小 ...

  9. BZOJ 2157 「国家集训队」旅游(树链剖分,线段树,边权转点权)【BZOJ计划】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 题目链接 https://hydro.ac/d/bzoj/p/2157 是 hydro 的 BZOJ ...

最新文章

  1. 2021年大数据ELK(三):Lucene全文检索库介绍
  2. 【20161109】noip模拟赛
  3. 关于分布式锁的面试题都在这里了
  4. 洛谷 P1494 [国家集训队]小Z的袜子
  5. 50张动图带你走进神奇的物理生物化学世界,超震撼!
  6. seata分布式事务回滚机制是如何实现的
  7. 【转载】TableLayout表格布局详解
  8. 数据预处理第4讲:缺失值填补
  9. C++ STL容器在for循环中删除迭代器 正确方法 it++正确吗
  10. 反编译获取任何微信小程序源码——看这篇就够了
  11. 分享一个很好的dll查看器
  12. 语音识别机器人课设Linux,机器人语音识别实验设计与实现
  13. 将iPhone短信完整迁移到安卓系统上的方法
  14. Linux命令简写与全称
  15. .net升级到4.0之后,出现;System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798...
  16. elastic-php实现多个OR并列查询的优化
  17. 快衰落,慢衰落,大尺度衰落,小尺度衰落的关系
  18. 在一个字符串中找出最长回文子串
  19. 人月神话之七 未雨绸缪
  20. 雷蛇linux识别,鼠标底部 真假狂蛇一眼即辨_Razer 地狱狂蛇鼠标_键鼠评测-中关村在线...

热门文章

  1. 使用linux创建文件系统,linux创建文件系统
  2. easyui-combotree指定key和text
  3. 【Web前端】CSS3新特性
  4. idea搜不到vue.js插件办法
  5. 震惊!!!一眼就能看懂的getBoundingClientRect用法!!!
  6. 自定义动画animate
  7. jdk7+tomcat7+myeclipse2014 详细安装步骤
  8. WSO2 Business Process Server(BPS)详细教程:结合Application Server服务(附源码下载)
  9. SQL SERVER中REPLACE函数和LTRIM函数简单使用
  10. vscode插件php注释插件PHP DocBlocker