「LuoguP3384」【模板】树链剖分】的更多相关文章

题意 给棵n个点的树.边有边权然后有三种操作 1.CHANGE i v 将编号为i的边权变为v 2.NEGATE a b 将a到b的所有边权变为相反数. 3.QUERY a b 查询a b路径的最大边权. (n,q<=10000) 题解 树剖裸题. 边权下放.线段树记录最大值最小值即可. #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<a…
/* 考虑将所求的值拆分 记每个点到根的路径长度为dis_i, 那么我们要求的就是\sum_{i = l} ^ r dis_i + dis[u] * (r - l + 1) - 2\sum_{i = l} ^ r dis_{LCA(i, u)} 前两个前缀和处理 对于第三个可以转换成一个经典问题, 就是对于每个点到根的路径 + 1, 那么第三个东西就是这个点到根的贡献和了 */ #include<cstdio> #include<algorithm> #include<cst…
luogu P3384 [模板]树链剖分 题目 #include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> #include<cstring> #include<iomanip> #include<algorithm> #include<ctime> #include<queue> #define rg register…
[luogu P3384] [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和 操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z 操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之和 输入输出格式 输入格式: 第一行包含4个正整数…
题目传送门 显然是一道模板题. 然而索引出现了错误,狂wa不止. 感谢神犇Dr_J指正.%%%orz. 建线段树的时候,第44行. 把sum[p]=bv[pos[l]]%mod;打成了sum[p]=bv[in[l]]%mod; 忘了要用反映射搞一下...... 树链剖分,从每个节点的儿子中,找出子树最大的一个作为重儿子. 然后以此将树链分成轻链和重链. 之后dfs一遍求出树链剖分序. 树链剖分序不仅保证子树内节点的编号在序列上连续,还保证一条重链上的节点的编号连续. 用一个线段树维护一下. 更改…
题意 题目链接 Sol 首先对询问差分一下,我们就只需要统计\(u, v, lca(u, v), fa[lca(u, v)]\)到根的路径的贡献. 再把每个点与\(k\)的lca的距离差分一下,则只需要统计每个点与\(k\)的lca深度.这个东西等价于所有的链与\(k\)到根的链的并. 树剖+主席树维护一下.这题的主席树需要区间加1,可以标记永久化合并标记 复杂度\(O(n\log ^2n)\) #include<bits/stdc++.h> #define Pair pair<LL,…
//点和线段树都从1开始 //边使用vector vector<int> G[maxn]; ],num[maxn],iii[maxn],b[maxn],a[maxn],top[maxn],deep[maxn],fa[maxn],idx[maxn]; //采用静态链表 //a[i] 是初始时树上每个点的权值 //b[i] 是经过bfs后每个点的权值 //idx[i] 是每个点在全局线段树中的下标 void build_List() { , rear = ; que[rear++] = ; fa[…
#include <bits/stdc++.h> using namespace std; typedef long long ll; int n, m, rt, mod, cnt, tot; int val[100005]; int dep[100005]; int id[100005], ed[100005]; int rk[100005]; int sz[100005]; int fa[100005]; int son[100005]; int top[100005]; ll sum[4…
洛谷·[模板]树链剖分 写在前面 首先,在学树链剖分之前最好先把 LCA.树形DP.DFS序 这三个知识点学了 emm还有必备的 链式前向星.线段树 也要先学了. 如果这三个知识点没掌握好的话,树链剖分难以理解也是当然的. 树链剖分 树链剖分 就是对一棵树分成几条链,把树形变为线性,减少处理难度 需要处理的问题: 将树从x到y结点最短路径上所有节点的值都加上z 求树从x到y结点最短路径上所有节点的值之和 将以x为根节点的子树内所有节点值都加上z 求以x为根节点的子树内所有节点值之和 目录: 概念…
Problem Portal Portal1: Luogu Description 如题,已知一棵包含\(N\)个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作\(1\): 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上\(z\): 操作\(2\): 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和: 操作\(3\): 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上\(z\): 操作\(4\): 格式: 4 x…
「模板」 树链剖分 HLD 不懂OOP的OIer乱用OOP出人命了. 谨此纪念人生第一次类套类. 以及第一次OI相关代码打过200行. #include <algorithm> #include <cstdio> #include <cstring> using std::swap; const int MAXN=100010,MAXM=200010; int n,m,rt,P; class HLD { public: HLD(void) { num=cnt=0; me…
[COGS2652]秘术「天文密葬法」(长链剖分,分数规划) 题面 Cogs 上面废话真多,建议直接拉到最下面看一句话题意吧: 给个树,第i个点有两个权值ai和bi,现在求一条长度为m的路径,使得Σai/Σbi最小 题解 看到这个式子就是裸的分数规划吧... 二分一个答案\(k\),式子变成了找一条长度为\(m\)的路径(题目里面路径长度的定义是点数) 满足\(\sum a-k\sum b\le 0\). 首先直接把\(m=-1\)也就是没有限制的点直接判掉,这个东西没有任何意义. (其实\(m…
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和 操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z 操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之和 输入输出格式 输入格式: 第一行包含4个正整数N.M.R.P,…
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和 操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z 操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之和 输入输出格式 输入格式: 第一行包含4个正整数N.M.R.P,…
树链剖分 将一棵树的每个节点到它所有子节点中子树和(所包含的点的个数)最大的那个子节点的这条边标记为"重边". 将其他的边标记为"轻边". 若果一个非根节点的子树的大小不小于任意一个他兄弟节点的子数大小(若有多个就看心情选取其中的一个),那么它到它父节点的连边为重边,这个节点为重子节点,否则,它到它父节点的连边为轻边. 将一条全部由重边组成的链叫做重链. (图中加粗的边为重边,未加粗的边为轻边,图取自www.baidu.com) 这样做有什么用呢? 如上图剖分后的树…
题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和 操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z 操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之和 输入输出格式 输入格式: 第一行包含4个正整数N.M.R.P,分别表示树的结点个数.操作个数…
树链剖分 树链剖分是一种对树的分治, 可以把树上的任意一条链分解为 \(O(\log n)\) 条在dfs序上相邻的子链, 便于数据结构(如线段树)来维护. 另外, 子树在dfs序上也是一个连续的区间, 同样可以利用数据结构维护. Code //sgt: // chg(v,l,r,rt,rl,rr) 区间修改 // que(l,r,rt,rl,rr) 区间查询 //树剖 int sz[nsz],fa[nsz],son[nsz],dep[nsz];//got through dfs1 int df…
[ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 I II. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身 Input 输入的第一行为一个整数n,表示节点的个数.接下来n – 1行,每行…
题面 给定一棵 \(n\) 个点的树,点带点权. 有 \(m\) 次操作,每次操作给定 \(x,y\) ,表示修改点 \(x\) 的权值为 \(y\) . 你需要在每次操作之后求出这棵树的最大权独立集的权值大小. 题解 如题所示 , 是个模板题 ... 首先考虑静态 \(dp\) , 令 \(dp_{u,0/1}\) 为 \(u\) 不存在 / 存在 于最大权独立集的权值大小 . 然后转移很显然 , 一个点存在于独立集中时 , 儿子全都不能选 . 不存在时 , 儿子可选可不选 . 令 \(v\)…
<题目链接> 题目大意: 给定一颗带点权的树,进行两种操作,一是给定树上一段路径,对其上每个点的点权增加或者减少一个数,二是对某个编号点的点权进行查询. 解题分析: 树链剖分的模板题,还不会树链剖分可以看这里 >>> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define Lson l,mid,rt<<…
//233 模板 LCA void dfs(int x,int f){ for(int i=0;i<E[x].size();i++){ int v = E[x][i]; if(v==f)continue; deep[v]=deep[x]+1; lca[v][0]=x; for(int j=1;j<maxm;j++){ int fa = lca[v][j-1]; if(fa==0)continue; lca[v][j]=lca[fa][j-1]; } dfs(v,x); } } int up(i…
BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上还是原树上,把两个区间的信息合并的时候,要注意中间相邻两个颜色是否相同. 这代码好长啊啊啊啊 幸好一次过了不然我估计永远也De不出来 #include <cstdio> #include <cstring> #include <algorithm> using namesp…
刚学的好玩算法,AC2题,非常开心. 其实很早就有教过,以前以为很难就没有学,现在发现其实很简单也很有用. 更重要的是我很好调试,两题都是几乎一遍过的. 介绍树链剖分前,先确保已经学会以下基本技巧: DFS序列,线段树/树状数组,LCA(最近公共祖先) DFS序列确保你能听懂以下环节,线段树/树状数组是维护序列的有力工具,而LCA涉及树上的很多基本问题. 经常会遇到这样的题目: 对于一棵树,给x到y的路径上的点/边都做一个操作,并且查询x到y的路径上的点/边的值. 如果不是x到y的路径,而是节点…
转载请注明出处,部分内容引自banananana大神的博客 ~~别说你不知道什么是树~~╮(─▽─)╭(帮你百度一下) 先来回顾两个问题:1,将树从x到y结点最短路径上所有节点的值都加上z 这也是个模板题了吧 我们很容易想到,树上差分可以以O(n+m)的优秀复杂度解决这个问题 2,求树从x到y结点最短路径上所有节点的值之和 lca大水题,我们又很容易地想到,dfs O(n)预处理每个节点的dis(即到根节点的最短路径长度) 然后对于每个询问,求出x,y两点的lca,利用lca的性质distanc…
题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1036 题目大意: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身 思路: 树链剖…
P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和 操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z 操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之和 输入输出格式 输入格式: 第一行包含4个正整数N.M.R.P,…
[模板·II]树链剖分 学长给我讲树链剖分,然而我并没有听懂,还是自学有用……另外感谢一篇Blog +by 自为风月马前卒+ 一.算法简述 树链剖分可以将一棵普通的多叉树转为线段树计算,不但可以实现对一棵子树的操作,还可以实现对两点之间路径的操作,或是求 LCA(看起来很高级). 其实树链剖分不算什么特别高难的算法,它建立在 LCA.线段树.DFS序 的基础上(如果不了解这些算法的还是先把这些算法学懂再看树链剖分吧 QwQ).又因为树链剖分的基础算法不难,树链剖分的题也逐渐被引入 OI 赛中.…
原题链接 树链剖分的模板题:在点带权树树上维护路径和,最大值和单点修改 这里给出几个定义 以任意点为根,然后记 size (u ) 为以 u 为根的子树的结点个数,令 v 为 u 所有儿子中 size 值最大的一个儿子,则 ( u , v ) 为重边, v 称为 u 的重儿子. u 到其余儿子的边为轻边. 根据定义:任何一个点属于且仅属于一条重链(这里一个点也算是重链) 我们称某条路径为重路径(链),当且仅当它全部由重边组成且端点两边没有重边了. 所以我们可以把这个棵树分成若干个重链,经过证明重…
[模板]树链剖分 题目描述 已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式: 2 x y 表示求树从x到y结点最短路径上所有节点的值之和 操作3: 格式: 3 x z 表示将以x为根节点的子树内所有节点值都加上z 操作4: 格式: 4 x 表示求以x为根节点的子树内所有节点值之和 树链剖分模板题废话 然而事实上我之前一直都不会树链剖分(真不知道我怎么活到现在的…
题目: 题目背景 ZJOI2008 DAY1 T4 题目描述 一棵树上有 n 个节点,编号分别为 1 到 n ,每个节点都有一个权值 w .我们将以下面的形式来要求你对这棵树完成一些操作:I.CHANGE u t :把结点 u 的权值改为 t :II.QMAX u v :询问从点 u 到点 v 的路径上的节点的最大权值:III.QSUM u v :询问从点 u 到点 v 的路径上的节点的权值和. 注意:从点 u 到点 v 的路径上的节点包括 u 和 v 本身. 输入格式 输入第一行为一个整数 n…