![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
树上问题
文章平均质量分 63
树
_lifehappy_
这个作者很懒,什么都没留下…
展开
-
L - Lookup Performance(主席树)
L - Lookup Performance问对于一颗二叉搜索树来说,如果我们要找一个值域区间的值有多少个,他会向下递归查找几次,设,第iii个节点所代表的最大最小值为li,ril_i, r_ili,ri,此时我们要查询L,RL, RL,R之间的值有多少个,如果L≤li≤ri≤RL \leq l_i \leq r_i \leq RL≤li≤ri≤R,那么我们不会递归下去查询,意味着当访问完这个点后不会对答案产生新的贡献。如果ri<L or li>Rr_i &原创 2021-05-27 14:41:16 · 305 阅读 · 0 评论 -
P3591 [POI2015]ODW(分块)
P3591 [POI2015]ODW给定一颗有nnn个节点的树,点有点权,给定一个长度为nnn的排列ppp,给定一个长度为n−1n - 1n−1的数组ccc,我们会在树上进行n−1n - 1n−1次行走,第iii次我们会从p[i]p[i]p[i]走到p[i+1]p[i + 1]p[i+1],步长为c[i]c[i]c[i],且走最短路,当我们到p[i+1]p[i + 1]p[i+1]的距离小于c[i]c[i]c[i]的时候,我们会直接到点p[i+1]p[i + 1]p[i+1],对每次行走,我们要求出其原创 2021-05-27 11:12:55 · 338 阅读 · 0 评论 -
P1600 [NOIP2016 提高组] 天天爱跑步(线段树合并,lca)
P1600 [NOIP2016 提高组] 天天爱跑步给定一颗有nnn个点的树,有mmm个人在树上移动,第iii个人从sis_isi点,移动到tit_iti点,且他们按照最短路移动,每秒移动一条边的距离,点iii在wiw_iwi时刻有一个观察员,我们需要对每个点统计,在wiw_iwi时刻有多少个人恰好到达这个点。如果第vvv个人,在wuw_uwu时刻恰好出现在点uuu,则一定有dis(sv,u)=wudis(s_v, u) = w_udis(sv,u)=wu,且uuu在sv,tvs_v,原创 2021-05-10 21:31:32 · 338 阅读 · 0 评论 -
B. Alyona and a tree(dsu on tree + bit)
B. Alyona and a tree(dsu on tree + bit)给定一颗以111号节点为根的树,每个点有点权aia_iai,边有边权,如果vvv控制了点uuu,当且仅当uuu是vvv的子树中的节点且dis(u,v)≤audis(u, v) \leq a_udis(u,v)≤au,我们定义d(u)d(u)d(u)为点111到点uuu距离,则对于某个点vvv来说我们就是要在其字数上找d(u)−d(v)≤aud(u) - d(v) \leq a_ud(u)−d(v)≤au,d(u)−au≤原创 2021-05-10 12:09:20 · 220 阅读 · 0 评论 -
E. Company(Codeforces Round #520 (Div. 2))
E. Company给定一颗有nnn个节点的树,有mmm次询问,每次询问给定[l,r][l, r][l,r],我们可以选择删除其中的一个点ppp,然后找到一个深度最深的rtrtrt,使得剩下的点都在rtrtrt的子树上。考虑对编号为[l,r][l, r][l,r]中的点,按照dfsdfsdfs序排序,容易想到,我们要么删除最前面的元素,要么删除最后面的元素,我们考虑枚举这两种情况,然后只要在剩下的点中随意挑选一个点,令其不断向上跳,知道找到一个点rtrtrt,剩下的点都在rtrtrt的子树上,这里可以原创 2021-05-07 19:51:28 · 285 阅读 · 0 评论 -
D. Best Edge Weight(最小生成树 + 树链剖分)(Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals))
D. Best Edge Weight给定一个有nnn个点mmm条边的无向连通图,有mmm次询问,每次询问第iii条边的权值最大为多少,这张图的所有最小生成树的方案中,一定包含第iii条边。先跑一边最小生成树,得到最小生成树,然后依次统计答案,分两种情况:1、这条边在最小生成树上假设这条边的边权为valuevaluevalue,把这条边断开,则分成了两个集合A,BA, BA,B,那么有一个性质,从集合AAA连向集合BBB的边,边权一定大于等于valuevaluevalue,如果从集合AAA连向集合原创 2021-05-03 10:26:58 · 299 阅读 · 0 评论 -
P3899 [湖南集训]谈笑风生(线段树合并)
P3899 [湖南集训]谈笑风生给定一颗以111号节点为根的树,如果a≠ba \neq ba=b,且aaa是bbb的祖先,则aaa比bbb更厉害,如果a≠ba \neq ba=b,且dis(a,b)≤xdis(a, b) \leq xdis(a,b)≤x,xxx为给定的一个数,则a,ba, ba,b紧邻。现有mmm次询问,每次询问给定p,kp, kp,k,为存在多少个三元组(p,b,c)(p, b, c)(p,b,c)满足一下条件:p,bp, bp,b都比ccc厉害。p,bp, bp,b彼原创 2021-04-28 20:00:06 · 212 阅读 · 0 评论 -
小 Q 与树(dsu on tree + segment tree)牛客练习赛 81 D
小 Q 与树给定一棵带权的树,每条边的距离都为111,要我们求∑u=1n∑v=1nmin(au,av)dis(u,v)\sum\limits_{u = 1} ^{n} \sum\limits_{v = 1} ^{n}min(a_u, a_v)dis(u, v)u=1∑nv=1∑nmin(au,av)dis(u,v),min(au,av)dis(u,v)=min(au,av)(dep[u]+dep[v]−2×dep[lca(u,v)])min(a_u, a_v) dis(u, v) = min(原创 2021-04-27 20:17:08 · 306 阅读 · 0 评论 -
F - Colorful Tree(LCA,树上差分,离线处理)
F - Colorful Tree给定一棵树,边有边权,且每条边有一个颜色,有mmm次操作,每次给定x,y,u,vx, y, u, vx,y,u,v,如果把颜色为xxx的边,边权修改为yyy,求u,vu, vu,v两点的距离,考虑设111号节点为根节点,设d[i]d[i]d[i]为111到iii的距离,dis(u,v)=d[u]+d[v]−2×d[lca]dis(u, v) = d[u] + d[v] - 2 \times d[lca]dis(u,v)=d[u]+d[v]−2×d[lca],设nu原创 2021-04-14 17:27:25 · 286 阅读 · 0 评论 -
Ancient Distance(妙啊!!!) [2020牛客暑期多校训练营(第四场)]
Ancient Distance给定一颗根为111有nnn个节点的树,每次可以选定树上kkk节点当作特殊节点,定义dis(u)dis(u)dis(u)为,从u−>1u->1u−>1遇上的第一个特殊点的距离,如果遇不上特殊点则dis(u)dis(u)dis(u)无穷大。有nnn次询问,问,每次选k∈{1,2,3,…,n−1,n}k \in \{1, 2, 3, \dots, n - 1, n\}k∈{1,2,3,…,n−1,n}个特殊点时的答案,有一个性质,最大答案为n−1n - 1原创 2021-03-27 17:58:21 · 234 阅读 · 0 评论 -
#6073. 「2017 山东一轮集训 Day5」距离(树链剖分 + 永久标记主席树)
#6073. 「2017 山东一轮集训 Day5」距离给定一颗有nnn个节点带边权的树,以及一个排列ppp,path(u,v)path(u, v)path(u,v)为u,vu, vu,v路径上的点集,dist(u,v)dist(u, v)dist(u,v)为u,vu, vu,v之间的最短路的长度。有mmm次询问,每次给定u,v,ku, v, ku,v,k,要求∑i∈path(u,v)dist(pi,k)\sum\limits_{i \in path(u, v)}dist(p_i, k)i∈path(u,原创 2021-03-27 14:01:57 · 251 阅读 · 0 评论 -
牛客练习赛71 F 红蓝图(kruskal重构树)
红蓝图给定两个参数x,tx, tx,t,删除边权大于ttt的红边,和边权小于ttt的蓝边,问对于所有的点yyy,既能通过红边走向xxx,又能通过蓝边走向xxx,的点有多少个。考虑对红边按照边权升序建立一颗kruskalkruskalkruskal重构树,对蓝边按照边权降序建立一颗kruskalkruskalkruskal重构树,在树一中我们向上跳,找到点权小于等于ttt的深度最浅的点uuu,同理在树二上我们向上跳,找到点权大于等于ttt的深度最浅的点vvv,最后我们只需要判断,这两个点所代表的子树集原创 2021-03-11 17:45:23 · 246 阅读 · 0 评论 -
P4899 [IOI2018] werewolf 狼人(kruskal 重构树 + 主席树)
P4899 [IOI2018] werewolf 狼人给定一个有nnn个点mmm条边的无向图,有QQQ个询问每次输入S,E,L,RS, E, L, RS,E,L,R,表示你在SSS点出发,要到EEE点,且初始时你是人形态,你只能走[L,n][L, n][L,n]的点,但是我们要以狼的形态走到终点,这个时候只能走[1,R][1, R][1,R]之间的点,也就是说我们要在[L,R][L, R][L,R]的某个点变身,问能否从S−>ES->ES−>E。一个比较容易想到的做法:显然,初原创 2021-03-09 17:51:21 · 2526 阅读 · 0 评论 -
Problem G. Pandaria(线段树合并 + Kruskal 重构树)
Problem G. Pandaria给定一个有nnn条边的无向连通图,每条边有对应的边权,每个点有一个颜色,问从一个点出发,经过不超过www的边权,所能到达的点中,颜色出现次数做多且颜色编号最小的是什么颜色。不超过某个权值所能到达的点,由此我们可以考虑建立升序kruskalkruskalkruskal重构树,然后从某个点倍增往上跳,直到不能跳为止,这个时候我们所在的点的子树所包含的点就是我们能够到达的点了,考虑用权值线段树来维护每一个点所代表的子树的信息,更新的时候我们只要往上进行线段树合并就行原创 2021-03-09 15:09:30 · 327 阅读 · 0 评论 -
F. Cheap Robot(kruskal 重构树)
F. Cheap Robot给定一个无向连通图,每条边有边权,路过需要消耗对应的电量(边权),有kkk个中心点,问从a−>ba-> ba−>b,我们最少需要带多少电,设最小为CCC,当通过一条边时,我们的电会减少(当电不够时即不能通过),当经过中心点时我们的电会立刻变为CCC,比较简单的想法:处理出任意两个中心点对的最短路出来,最后我们只需要得到中心点对的升序kruskalkruskalkruskal最小生成树,然后每次查询两点之间的lcalcalca的权值即可。我们假设dis[x原创 2021-03-08 21:52:44 · 259 阅读 · 0 评论 -
kruskal 重构树(讲解 + 例题)
kruskal重构树如何建树模仿kruskalkruskalkruskal,先将所有边排序。依次遍历每一条边,如果这条边的两个节点(u,vu, vu,v)不在同一个连通块里面,则新建一个nodenodenode节点,更新fa[u]=fa[v]=nodefa[u] = fa[v] = nodefa[u]=fa[v]=node,同时有fa[node]=nodefa[node] = nodefa[node]=node,建立node−>u,node−>vnode-> u, node-&g原创 2021-03-07 21:18:58 · 639 阅读 · 0 评论 -
#3551. [ONTAK2010]Peaks加强版(kruskal 重构树 + 主席树)
#3551. [ONTAK2010]Peaks加强版我们要求从一个点出发经过困难值小于等于xxx的路径所能到达的山峰中第kkk高的是什么。考虑按照边权升序,建议kruskalkruskalkruskal重构树,然后倍增向上跳,找到困难值小于等于xxx的深度最小的节点uuu,那么我们只要在uuu的子树中询问第kkk大即可,所以可以用主席树来写,依照dfsdfsdfs序,对每个节点建立一颗主席树,然后在主席树上查找第kkk大即可。#include <bits/stdc++.h>using原创 2021-03-07 21:18:13 · 284 阅读 · 1 评论 -
P4768 [NOI2018] 归程(kruskal 重构树)
P4768 [NOI2018] 归程给定一个nnn个点,mmm条边的无向联通图,边的描述为[u,v,l,a][u, v, l, a][u,v,l,a],表示uuu,vvv连有一条长度为lll,海拔为aaa的边,有QQQ个询问,每次给出一个出发点uuu和一个海拔限制高度ppp,并且在出发点有一辆车,这辆车可以通过海拔大于ppp的边,问,从u−>1u->1u−>1的最短步行长度是什么多少。设从uuu坐车出发可到的点集为SSS,我们的任务就是找到一个点v,v∈Sv, v \in Sv,v原创 2021-03-07 21:17:05 · 306 阅读 · 0 评论 -
采蘑菇的克拉莉丝(树链剖分)
采蘑菇的克拉莉丝一个有点意思的树链剖分的题。题意:一棵树,有两种操作:①:在点vvv放xxx个蘑菇。②:将起点变为vvv。每次计算收集所有蘑菇的代价。收集蘑菇的代价为,起点到所在蘑菇的路径上的第一条边的权值,也就是与起点直接相连的边的权值。做法:选定111号节点为根节点,考虑树链剖分,对于更新操作,我们更新从v−>1v->1v−>1的所有重链上的蘑菇数量,在轻链与重链的连接处,直接统计轻链对当前节点的贡献即可。查询时,我们只需要查询重儿子上的蘑菇的数量然后乘上边权,再原创 2021-03-06 13:44:31 · 261 阅读 · 0 评论 -
2019ICPC西安邀请赛 E. Tree(树剖 + 线段树)
Tree给定一棵树,节点有点权,然后有三种操作:一、修改1−>s1->s1−>s的路径上的点权与ttt进行按位或。二、修改1−>s1->s1−>s的路径上的点权与ttt进行按位与。三、查询1−>s1->s1−>s的路径上的点权异或和是否为ttt。可以考虑树剖,然后对每一位维护一个010101线段树,然后push_uppush\_uppush_up区间111的个数即可,对于按位或操作,如果当前位为111,则区间覆盖为111,否则不做操作。对于原创 2021-02-23 20:53:48 · 313 阅读 · 1 评论 -
P3250 [HNOI2016]网络(利用堆建线段树 + 树剖)
P3250 [HNOI2016]网络做法有点神奇!!!利用堆作为节点建立一颗线段树,用堆维护线段树上点的信息。说说查询操作,我们的目的是要查询,没有经过这个点的事件最大值,考虑如何维护。我们定义线段树上的信息,每个点记录的是没有经过这个区间的事件值。事件插入,我们可以利用树剖得到从x−>yx->yx−>y的路径形成的logn\log nlogn个连续的段,我们先把这些段给存下来,然后再按照lll排个序,在这些段之外插入事件值。同样的事件删除,我们只要在这些段之外删除事件值即可原创 2021-02-20 15:26:00 · 291 阅读 · 0 评论 -
ICPC 南昌现场赛 K:Tree(dsu on tree + 动态开点线段树)
Tree让我们找满足一下五个条件的(x,y(x, y(x,y)点对有多少:x≠yx \neq yx=yxxx不是yyy的祖先yyy不是xxx的祖先dis(x,y)≤kdis(x, y)\leq kdis(x,y)≤kzzz是x,yx, yx,y的最近公共祖先,valuex+valuey=2valuezvalue_x + value_y = 2value_zvaluex+valuey=2valuez。读题目观察到每个节点的valuevaluevalue只有[0,105][0, 10原创 2021-02-09 20:27:06 · 314 阅读 · 0 评论 -
E. Party Company(树上问题)
E. Party Company容易发现这是一颗树形结构,根节点为111,并且有点权从根节点开始递减。题目大意就是给定一个点u,l,ru, l, ru,l,r,对于于uuu在同一个连通块里,并且点权是在[l,r][l, r][l,r]之间的点答案贡献加一。如果理解到上述的题意,那这题就变得简单了。由于我们要求的是在同一个联通块里的,并且点权具有单调性,我们可以通过二分跳转到可以满足的深度最小的节点上去,在这个节点依附上lll。容易想到,满足要求的点一定是出现在这个节点的子树上的,所以我们可以动态维原创 2021-01-26 19:37:47 · 1080 阅读 · 0 评论 -
A and B and Lecture Rooms
A and B and Lecture Rooms题意要求我们找有多少个点iii满足dis(i,x),dis(i,y)dis(i, x), dis(i, y)dis(i,x),dis(i,y),输出点iii的数量即可。首先特判无解的情况就是dis(x,y)dis(x, y)dis(x,y)为奇数时,接下来我们讨论有解的情况,大致分为两类。首先我们一定可以在x−>yx->yx−>y的路径上找到一个点满足要求。这个点不在lca(x,y)lca(x, y)lca(x,y)上:如图我们原创 2020-11-26 20:55:12 · 394 阅读 · 1 评论 -
HDU 4812 D Tree (点分治) (2013ACM/ICPC亚洲区南京站现场赛)
HDU 4812 D Tree思路点对距离相等并且要求输出字典序最小的点对,距离相等不就是点分治裸题了嘛,照着这个思路出发我们只要记录下所有点对是满足要求的,然后再去找字典序最小的点对就行了,接下来就是考虑如何求最小点对了,按照路径相加的原理,这里我们处理出所有路径到当前根节点的乘积出来,然后把这个数与k相除得到我们要找的点,当然,这个除法是模意义下的逆元乘法。然后这题就变成了点分治裸题了。代码/* Author : lifehappy*/#pragma comment(linker,原创 2020-08-31 01:01:29 · 285 阅读 · 0 评论 -
POJ 1741 Tree(点分治)
POJ 1741 Tree思路男人八题中的一题,写完这题算是18\frac{1}{8}81个男人了!这题是树上距离的计数问题,能够通过巧妙地排序加双指针来解决,统计距离应该大家都会地,我就来说明一下如何计数吧。假设我们已经求得距离并且排好序之后是这样的:1 3 3 5 6 71\ 3\ 3\ 5\ 6\ 71 3 3 5 6 7,我们要求的距离是小于等于777的,初始设置i=1,j=6i =原创 2020-08-30 10:37:45 · 230 阅读 · 0 评论 -
点分治(简要讲解 + 模板)
树上点分治思想两个点之间的距离无非就是两种关系:我们约定dis[i]dis[i]dis[i]表示这个点到当前根节点的距离dis[u]+dis[v]dis[u] + dis[v]dis[u]+dis[v],在同一个根节点的不同子树上。dis[u]+dis[v]dis[u] + dis[v]dis[u]+dis[v],在同一个根节点的同一个节点上。树上点分治的思想就是通过改变根节点从而转化任意两点的距离为在同一个根节点下的情况。举个例子当我们选定1号节点作为我们的根节点时,我们可以简单的得到原创 2020-05-30 22:04:37 · 723 阅读 · 0 评论 -
dsu on tree 题集 + ac代码
文章目录**[600E - Lomsat gelral](https://codeforces.ml/problemset/problem/600/E)****[树上数颜色](https://www.luogu.org/problemnew/show/U41492)****[570D - Tree Requests](https://codeforces.ml/problemset/problem/570/D)****[ 阔力梯的树](https://ac.nowcoder.com/acm/contest/原创 2020-08-28 21:07:45 · 592 阅读 · 5 评论 -
E. Jamie and Tree(树链剖分 + 线段树)
E. Jamie and Tree思路直接root=vroot = vroot=v;找lcalcalca,lca=lca(root,u),lca(root,v),lca(u,v)lca = {lca(root, u), lca(root, v), lca(u, v)}lca=lca(root,u),lca(root,v),lca(u,v)中depdepdep最深的:rootrootroot不在lcalcalca的子树上:直接[l[lca],r[lca]][l[lca], r[lca]]原创 2020-10-04 20:33:54 · 299 阅读 · 0 评论 -
NC14250 MMSet2
MMSet2思路这道题目显然能够通过3×105×1063 \times 10 ^ 5 \times 10 ^ 63×105×106的复杂度来暴力,这显然不能达到题目要求的复杂度,因此我们可以对题目要求我们计算的东西进行转换。某个点到所有点集的最大距离最小,这就有点像是重心的求法了,但是这题又有所不同,如果这是在一颗树上,显然我们可以很快的得到答案,ans=⌈重心2⌉ans = \lceil \frac{重心}{2} \rceilans=⌈2重心⌉,所以这题我们也可以转换思想,每次求解得到点集中两点之原创 2020-08-17 15:34:57 · 245 阅读 · 0 评论 -
luogu P6178 【模板】Matrix-Tree 定理
luogu P6178 【模板】Matrix-Tree 定理1.无向图假设现在给定一个图 GG .度数矩阵D:若存在边$ (x,y,z)(x,y,z)$ ,则 D[x][x]+=z;D[y][y]+=z;D[x][x]+=z;D[y][y]+=zD[x][x]+=z;D[y][y]+=z;D[x][x]+=z;D[y][y]+=zD[x][x]+=z;D[y][y]+=z;D[x][x]+=z;D[y][y]+=z;邻接矩阵C:若存在边 (x,y,z)(x,y,z)(x,y,z)(x,y,z)(x,原创 2020-08-07 17:11:15 · 249 阅读 · 0 评论 -
LCA求解的四种模板
LCA求解的四种模板或许更好的阅读体验树剖在线求解LCA思想树剖这里就不多解释了,求解LCA的过程就是轻重链的跳转,跟树剖求任意两点间的距离一样的操作,只不过不用线段树去维护disdisdis了,那就直接上代码吧。代码#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1e6 + 10;int head[N], to[N << 1], nex[N <原创 2020-06-02 21:03:45 · 385 阅读 · 0 评论