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 [模板]树链剖分错误记录 首先感谢\(lfd\)在课上调了出来\(Orz\) \(1\).以后少写全局变量 \(2\).线段树递归的时候最好把左右区间一起传 \(3\).写\(dfs\)的时候不要写错名字 \(4\).使用线段树的操作的时候才要用到\(dfs\)序 \(5\).需要开一个数组来记录在\(dfs\)序下的节点是什么也方便线段树的赋值 \(6\).注意\(down\)函数内怎样更新 \(7\).在查询的时候并不需要向上更新 由于\(yxj\)看了\(lfd\)敲的树链…
洛谷P3384 #include <bits/stdc++.h> #define DBG(x) cerr << #x << " = " << x << endl; const int maxn = 1e5+5; using namespace std; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch < '0' || ch > '9'){if(c…
树链剖分 将一棵树的每个节点到它所有子节点中子树和(所包含的点的个数)最大的那个子节点的这条边标记为"重边". 将其他的边标记为"轻边". 若果一个非根节点的子树的大小不小于任意一个他兄弟节点的子数大小(若有多个就看心情选取其中的一个),那么它到它父节点的连边为重边,这个节点为重子节点,否则,它到它父节点的连边为轻边. 将一条全部由重边组成的链叫做重链. (图中加粗的边为重边,未加粗的边为轻边,图取自www.baidu.com) 这样做有什么用呢? 如上图剖分后的树…
题目传送门 显然是一道模板题. 然而索引出现了错误,狂wa不止. 感谢神犇Dr_J指正.%%%orz. 建线段树的时候,第44行. 把sum[p]=bv[pos[l]]%mod;打成了sum[p]=bv[in[l]]%mod; 忘了要用反映射搞一下...... 树链剖分,从每个节点的儿子中,找出子树最大的一个作为重儿子. 然后以此将树链分成轻链和重链. 之后dfs一遍求出树链剖分序. 树链剖分序不仅保证子树内节点的编号在序列上连续,还保证一条重链上的节点的编号连续. 用一个线段树维护一下. 更改…
洛谷题目传送门 仍然是一个板子. 不过蒟蒻去学了一下BIT维护区间修改区间求和,常数果真十分优秀 设数列为\(a_i\),差分数组\(d_ i=a_ i-a_ {i-1}\),前缀和\(s_i=\sum\limits_ {j=1}^ia_ j\) 显然有\(a_ i=\sum\limits_ {j=1}^id_ j\) 于是大力展开得到 \[s_i=\sum\limits_{j=1}^i(i-j+1)d_j\] \[s_i=(i+1)\sum\limits_{i=1}^jd_j-\sum\lim…
如题,已知一棵包含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为根节点的子树内所有节点值之和 --by洛谷 一听名字就知道是模板: 有关树链剖分的内容 对子树操作,可理解为对dfs序上fa开头长度…
我们有时候遇到这样一类题目,让我们维护树上路径的某些信息,这个时候发现我们无法用线段树或者树状数组来维护这些信息,那么我们就有着一种新的数据结构,树剖:将一棵树划分成若干条链,用数据结构去维护每条链,复杂度为O(logN). 剖分方法:    盲目剖分    随机剖分   启发式剖分综合比较,启发式剖分是剖分时的最佳选择. 将树中的边分为:轻边和重边  定义size(X)为以X为根的子树的节点个数.  令V为U的儿子节点中size值最大的节点,那么边(U,V)被称为重边,树中重边之外的边被称为轻…
题面 挺好的一道树剖模板: 首先要学会最模板的树剖: 然后这道题要注意几个细节: 初始化时,seg[0]=1,seg[root]=1,top[root]=root,rev[1]=root; 在线段树上进行操作时,要使用lazy标记: 对于一个以x为根的子树,它子树中所有的元素一定时在线段树上连续的区间,且以seg[x]开始,以seg[x]+size[x]-1结束: 然后写码的时候注意不要手残(比如说预处理时写成了dep[u]=dep[u]+1); #include <bits/stdc++.h>…
题面传送门 我!竟!然!独!立!A!C!了!这!道!题!incredible! 首先看到这类最大化某个分式的题目,可以套路地想到分数规划,考虑二分答案 \(mid\) 并检验是否存在合法的 \(S\) 使得 \(\dfrac{\sum\limits_{e\in S}v(e)}{|S|}\ge mid\),将分母乘过去并稍微变个形可得 \(\sum\limits_{e\in S}v(e)-mid\ge 0\),也就是说我们将每条边边权都减去 \(mid\) 并检验包含 \([L,R]\) 条边的路…