树链剖分
枫茗、
HELLO,WORLD!
展开
-
Count Descendants--长链剖分
题目链接:E - Count Descendants题意:给你一棵树,1为根节点,在第1层,q次询问;每次询问输入两个数,u,d;要求计算出在树的第d+1层并且是节点u的子孙节点的节点个数思路:读完题很明显是长链剖分板子题,求某节点对应子树第k层的信息。代码:#include <bits/stdc++.h> typedef long long ll;using namespace std; const int N=2e5+10;int h[N],to原创 2022-04-16 11:37:50 · 779 阅读 · 0 评论 -
松鼠的新家--树链剖分
题意:松鼠的家有n个房间,呈树形结构,按a1-an的顺序去参观完整个房间,每次经过房间i都要吃掉房间i里的一颗糖,到达最后一个房间时,有大餐无需再吃糖,问每个房间最少需要放多少颗糖才能保证松鼠完成参观。输入描述:第一行一个整数n,表示房间个数第二行n个整数,依次描述a1-an接下来n-1行,每行两个整数x,y,表示标号x和y的两个房间之间有树枝相连。思路:树链剖分完后用线段树去维护,从一个房间到下一个房间相当于此路径上的所有点点权都加1,最后每个中转节点都要减去1(他们是上一次的原创 2022-04-15 16:25:13 · 121 阅读 · 0 评论 -
树上路径--树链剖分+线段树 维护两两相乘和
题目链接:树上路径题意:给出一个n个点的树,1号节点为根节点,每个点有一个权值你需要支持以下操作。1.将以u为根的子树内节点(包括u)的权值加val2.将(u, v)路径上的节点权值加val3.询问(u, v)路径上节点的权值两两相乘的和思路:树链剖分完建立线段树去维护连续区间第一个操作就是树链剖分完之后修改L[u]到R[u]的权值第二个操作就是采用轻重剖分完找LCA的思想,每次修改区间[id[top[u]],id[u]](u为深度大的点),修改完后u=fa[top[原创 2022-04-15 15:49:09 · 354 阅读 · 0 评论 -
Distance on the tree--树上主席树,树上差分(按边差分)
题目链接:Distance on the tree - 题库 - 计蒜客题意:给定一棵n个节点带边权的树和m次询问,每次询问u到v的路径上权值小于等于k的边的个数。第一行n,m。接下来n-1行u,v,w,表示节点u和v之间的边权为w,在接下来m行u,v,k,查询u到v的路径上权值小于等于k的边的个数。(2<=n<=1e5,1<=m<=1e5,1<=w,k<=1e9)样例:输入13 31 3 22 3 71 3 01 2 41 2 7原创 2022-04-01 16:44:53 · 333 阅读 · 0 评论 -
[LNOI2014]LCA--树链剖分例练习
题目链接:A-[LNOI2014]LCA_牛客竞赛数据结构专题班树链剖分 (nowcoder.com)题意:1≤n≤50000,1≤m≤50000样例:输入5 200111 4 31 4 2输出85思路:本题的关键在于深度的一个巧妙转化,我们假设树上所有点的初始权值为0,对于点x,我们将从根节点到x路径上所有点的点权加1,对于x和z的最近公共祖先的深度就是从根节点到z的路径上的点权之和,自己也可以在纸上画画。明确了这个转化之后,对于[l.原创 2022-04-01 14:24:51 · 906 阅读 · 0 评论 -
轻重树链剖分模板
#include <bits/stdc++.h>using namespace std;const int N=1e5+10;int a[N];int h[N],to[2*N],ne[2*N],cnt;int sz[N],dep[N],fa[N],son[N];int top[N],id[N],dfn;void init(){ dfn=0; cnt=0; memset(h,-1,sizeof(h));}void add_edge(int u,int v){ to.原创 2022-03-28 18:19:45 · 56 阅读 · 0 评论