
树
文章平均质量分 67
yzyyylx
这个作者很懒,什么都没留下…
展开
-
codeforces1149C Tree Generator™
题面题意给出一棵树的括号序列,每次询问会交换括号序列中的两个字符,求交换之后树的直径.做法此题的难点在于如何将树的直径转化为括号序列上的某个值.将’)‘看作1,’('看作-1后,发现直径就是maxi−1<=j<=k<=2∗(n−1)∑x=ijnum[x]−∑x=j+1knum[x]\max_{i-1<=j<=k&am...原创 2019-05-12 18:37:26 · 451 阅读 · 1 评论 -
CodeForces - 1042F Leaf Sets
#题面#题意给出一棵树,要求将其叶子分成几个集合,要求每个集合中叶子两两之间的距离不大于k,求至少要将其分成几个集合。#做法因为n很大,所以考虑贪心。首先dfs,我们可以自下而上逐个子树考虑,对于一个子树,可以将其拆成几条链,可以将较短的几条链合并在一起,而长的链独自一个集合,然后其父节点与短链集合相连,这样可以保证答案较优。具体见代码,比较难描述。#代码#include&amp;lt;i...原创 2018-09-18 07:58:04 · 715 阅读 · 1 评论 -
圆方树
解释对每一个点双新建一个方点,由这个方点向点双中的每一个点连一条新边,新边构成的新图即为圆方树,可以发现这张图必然是一棵树(如果原图不连通就是森林)。 可以发现,圆方树中任意两个圆点和任意两个方点之间都没有边。 圆方树可以用于处理图的问题,方点可以用于存储所有与它相连的圆点的信息(有时候存储部分,据题目而定)。代码void dfs(int now){ int p,q,t;...原创 2018-09-03 20:27:47 · 348 阅读 · 0 评论 -
loj #2322. 「清华集训 2017」Hello world!
题面题意给出一棵树,要求支持两种操作: 1.给出u,v,从u开始每次向v条k条边(如果到v的距离小于k则直接到达v),对所有经过的点的权值开根。 2.给出u,v,从u开始每次向v条k条边(如果到v的距离小于k则直接到达v),求所有经过的点的权值和。做法根据每次跳的长度k进行分块,令块大小为S。 然后对于1~S中的每一个数i建一个森林,每个点的父亲是这个点在原树上与它深...原创 2018-09-02 11:35:33 · 677 阅读 · 1 评论 -
[APIO2018] Duathlon 铁人两项
题面题意给出一张无向图,问有多少组点a,b,c满足存在至少一条从a经过b到c的简单路径。做法首先考虑枚举点a,c,这样每一组a,c对答案的贡献就是可能在ac路径之间出现的点的个数,然后我们可以对图建圆方树,使圆点的点权为-1(去重),方点的点权为点双的大小,这样ac路径之间出现的点的个数就是a,c两点在圆方树上的路径的点权和,然后用树形dp统计每个点对答案的贡献即可。 注...原创 2018-09-04 07:51:03 · 298 阅读 · 0 评论 -
AtCoder 2381 Nuske vs Phantom Thnook
题面题意给出一个01矩阵,任意两个1之间的路径(不能经过0)之多只有1条,多次询问每个子矩形中由1构成的联通块的个数。做法这题的关键是要抓住任意两个1之间的路径(不能经过0)之多只有1条这个条件,这就意味着1构成的联通块都是树,而树的点数-边数=1,因此只要用二维前缀和维护子矩阵中1的个数和1-1这样的边的个数,相减即为联通块的个数。代码#include<io...原创 2018-08-06 20:19:49 · 193 阅读 · 1 评论 -
CodeForces - 516D Drazil and Morning Exercise
题面题意给出一棵树,每条边有一个长度,每次询问给出一个L,请选择一个符合要求的最大联通块,要求该联通块中所有点到树上离它最远的点的距离的最大值与最小值之差小于等于L,输出联通块的最大大小。做法首先要求出每个点到树上离它最远的点的距离,然后以此距离最短的点为根节点,可以发现此时所有点到最远点必定经过这个根节点,这就意味着该树有着类似笛卡尔树的性质:根节点到最远点的距离是以它为...原创 2018-07-31 18:43:34 · 561 阅读 · 0 评论 -
HDU 4118 Holiday's Accommodation
题面题意给出一棵树,每个点有一个人,每条边有一个长度,现在每个人要到另外一个点,且不同人不能到相同的点,要求他们走的最短距离之和最大。做法如果直接考虑每个人走到哪一个点,是阶乘级别的,而且好像没有什么好的贪心方法。 但是可以从边对答案的贡献来考虑,一条边最多被经过2*min(与它相连的两棵子树的大小)次,把所有边的最大贡献加起来即为答案。代码#include<...原创 2018-07-26 11:05:38 · 971 阅读 · 1 评论 -
克鲁斯卡尔重构树 (以BZOJ 3732 Network,[NOI2018]归程为例)
建树方法在克鲁斯卡尔求最短路的基础上对原来的图进行一定的修改,与克鲁斯卡尔求最短路的区别在于每当找到一条树边时,将其变成一个点,这个点连接这条边连接的两个联通块(的根节点),然后就可以得到一棵树,这棵树的叶子结点,其余节点都是树边,权值就是树边的长度。性质可以发现,这棵树上的某棵子树的根节点是这棵子树的多有点的权值的最大值,如果要求某两个点的路径上的最大边权的最小值,求它们在这棵树...原创 2018-07-19 16:39:59 · 877 阅读 · 0 评论 -
CodeForces - 383C Propagating tree
题面题意给出一棵树,每个点有一个点权,要求支持两种操作: 1.查询某个点的点权 2.子树加p,在子树中,与其深度的奇偶性相同的点加p,不同的点减p。做法因为在修改时会根据深度的奇偶性做出不同的修改,因此可以维护两棵线段树,一棵维护奇数深度的,另一棵维护偶数深度的,这样对于而操作只要在一棵树上加p,在另一棵树上减p即可。代码#include<iostream...原创 2018-07-07 16:22:21 · 271 阅读 · 0 评论 -
SPOJ - QTREE4 Query on a tree IV
题面题意给出一棵树,一开始所有点都是白点,每次一共有两种操作: 1.A,询问两端都是白点的路径的最大长度 2.C,改变某个点的颜色(白改黑或黑改白)。做法算法是树分治,边分和点分都可以。 边分相对要容易很多,因为它每次将树分为两个,统计方便,具体操作就是对于每条边的建两个支持删除某个元素的堆,分别维护这条边的左右两个端点不经过此边和其他边分中心的最大深度,然后再用一个...原创 2018-07-13 12:41:50 · 681 阅读 · 0 评论 -
边分
说明树分治的一种,与点分相似,每次找到两边节点数量相对接近的一条边(与重心相似),然后考虑经过这条边的路径,之后在对边的两边分别考虑。 对于菊花图,如果直接边分,那么复杂度显然会由O(logn)退化成O(n),因此在边分之前,先要rebuild: 统计出每个节点的儿子节点个数,若它大于S(一般为2,可以根据实际情况调整),则在其儿子节点改为S个虚点,与它们连虚边,原来的儿子节点平均分配到S...原创 2018-07-13 11:41:52 · 13452 阅读 · 0 评论 -
支配树(以HDU4694 Important Sisters为例)
定义在一个流程图(单源有向图)中,如果从源点到某个点p必须要经过某个点q,则q是p的支配点,我们记除了该点自己外,所有支配点中到它最近的点为该点的最近支配点(记为idom),将所有点与它的最近支配点连边构成的树就是支配树。求法对于DAG,非常简单,建出来的支配树也就是灭绝树。 首先建出dfs树,求出每个点的dfs序,之后点的大小比较都根据dfs序。 对于一般流程图则相对复杂,首先定...原创 2018-07-12 19:31:57 · 530 阅读 · 0 评论 -
边双(以CodeForces - 652E Pursuit For Artifacts为例)
定义若一张连通图中去掉任意一条边后仍然连通,则它是一个边双。求法可以发现,边双中不包含桥,因此将图中的桥去掉之后,剩下的图中的所有连通块都是边双。例题(CodeForces - 652E Pursuit For Artifacts)题意给出一张无向图,一些边上有一个神器,每条边只能经过一次,问,从s走到t,能否顺便拿到至少一个神器。做法可以发现,如...原创 2018-07-11 17:49:54 · 381 阅读 · 0 评论 -
点双(以HDU - 3686 Traffic Real Time Query System为例)
定义一张连通图中,若任意两个点之间都有至少两条没有重复点的路径,则这是一个点双。求法和tarjan系列的算法相似,在建dfs树的同时,可以发现每个割点都会将这个图分为几个点双,且每个割点都属于多个点双,因此,我们可以在dfs的同时,将所经过的边全部存起来,每当扫到一个割点就统计这个割点所分出的点双。代码void dfs(int now){// if(xh>D...原创 2018-07-11 17:23:15 · 403 阅读 · 0 评论 -
CodeChef - TAPAIR Counting The Important Pairs
题面题意给出一张无向连通图,问去掉两条边后能将其分成多个连通块共有几种方法。做法建出dfs树后,发现一共有三种方法使它被分为多个连通块: 1.这两条边中有至少一条边是桥。 2.这两条边分别是仅被一条返祖边覆盖的树边和覆盖这条树边的返祖边。 3.被相同返祖边覆盖的两条树边。 对于第一种方法,只要统计出树边的数量即可,要注意和第三种方法的重合部分。 对于第二种方法,可...原创 2018-07-11 16:01:32 · 398 阅读 · 0 评论 -
CodeForces 1051F The Shortest Statement
题面题意给出一张无向连通图,边数最多比点数多20,多次询问两点之间的最短路。做法这题的关键就是边数比点数多20,因此可以考虑先建出一棵树,这样仅在树上的路径就可以以log复杂度求出。下面考虑不在树上的21条边,易知,如果最短路经过这多出来的至多21条边,则必定经过这21条边两端的至多42个点,因此我们可以预先处理出这至多42个点到图中每个点的最短路,这样a,b两点间的最短路即为min(d...原创 2018-09-21 14:08:30 · 325 阅读 · 1 评论 -
SEERC 2017 L Divide and Conquer
题面题意给出由A,B两棵树重合后组成的一张图,问至少删掉几条边才能将图分成两块。做法首先,这张图一共有nnn个点,2∗(n−1)2*(n-1)2∗(n−1)条边,因此度数最小的点的度数一定小于等于3,这就说明了答案一定为2或3,这也就说明了A,B两棵树中一定有一棵树种只删了一条边,因此我们可以暴力枚举在A树中删掉的是哪条边,然后统计B树中有几条边连接着A树删掉这条边后的两个联通块,而这个...原创 2018-10-28 15:50:02 · 299 阅读 · 0 评论 -
BZOJ1808: [Ioi2007]training 训练路径
题面题意给出一棵树和几条非树边,每条非树边有一个权值,表示去掉它的代价,树边不能被去掉,问若要让图中没有偶环,至少要付出多少代价。每个点的度数小于等于10做法首先与树组成偶环的边直接去掉,然后我们可以将非树边看作树上两点间的路径,然后可以发现如果两条路径边的交集非空,则这两条非树边一定能与一些树边组成偶环。然后问题就转化为了:在一棵树上有一些路径,每条路径有一个权值,从中选择一些没有边...原创 2018-10-30 16:13:55 · 312 阅读 · 0 评论 -
[ZJOI2019]语言
题面题意有一棵有n个点的树,上面有m条链,两个点可以互达当且仅当存在一条两点都在上面的链.问有几对点可以互达.做法对每个点考虑它对答案的贡献,可以发现,若点x在链a1,b1;a2,b2.....a_1,b_1;a_2,b_2.....a1,b1;a2,b2.....上,则与x可以互达的点恰好都在点a1,b1,a2,b2.....a_1,b_1,a_2,b_2.....a1,b1...原创 2019-05-14 10:44:06 · 552 阅读 · 0 评论 -
codeforces1163 F Indecisive Taxi Fee
题面题意给出一张无向图,每次询问修改一条边的权值,并询问此时点1到点n的最短路的长度,询问之间相互独立.做法首先将修改分成以下三种情况:1.修改了非最短路上的边,则最短路变为min(\min(min(原来的最短路长度,d[1][u]+d[v][n]+len),d[1][u]+d[v][n]+len),d[1][u]+d[v][n]+len)2.修改了最短路上的边,且比原来短,则最短路...原创 2019-05-13 22:33:49 · 658 阅读 · 0 评论 -
codeforces1119F Niyaz and Small Degrees
题面题意给出一棵有n个点的树,每条边有一个边权,对于[0,n−1][0,n-1][0,n−1]的每一个数x求,至少删掉权值和为多少的边后,所有点的度数都小于等于x.做法首先考虑对于一个x怎么做,记dp[i][2]dp[i][2]dp[i][2]表示第i个点与其父亲之间的边是否删去时,以i为根的子树最小要删去权值和为多少的点,转移时可以用堆处理出所有子节点t中dp[t][1]+val−dp[...原创 2019-04-12 19:54:13 · 482 阅读 · 0 评论 -
codeforces864F Cities Excursions
题面题意给出一张有向图,多次询问,每次询问给出三个数u,v,k,表示询问从u到v的路径上第k个点是什么。若u,v不连通或长度大于k或该路径无限长输出-1做法首先可以通过n次dfs求出数组ok,ok[i][j]表示从点i出发是否可到达点j,然后将询问离线。对于以点v为终点的询问,可以对于所有可以到达它的点u(u!=v),找到点u直接连接,字典序最小且可以到达点v的点t,并让t向v连一条边...原创 2019-03-21 19:00:16 · 328 阅读 · 0 评论 -
codeforces1137F Matches Are Not a Child's Play
题面题意给出一棵树,每个点有一个优先级,初始为自己的标号,如果每次删去树上优先级最低的叶子,将得到一个序列,要求维护有三种操作:1.将一个点的优先级修改为此时所有点的优先级的最大值+12.询问某个点在序列中的位置3.询问两个点中哪一个点先被删去做法首先第三种操作只要经过两次二操作即可得到,因此不用管它。观察一下第一种操作之后对序列的影响,发现第一次操作就相当于把原来最大节点到修改节...原创 2019-03-12 12:05:40 · 520 阅读 · 0 评论 -
codeforces403E Two Rooted Trees
题面题意给出两棵树A,B,其根节点都是1,现在删掉A树中的一条边(u,v),然后将B树的所有满足p,q两点中有一点在u,v的公共子树中,另外一个点不在的边(p,q)删去,然后再按上述规则来删掉A树中的所有满足条件的边,输出删边顺序。做法首先可以对于一棵树上的边(p,q),如果它要被删掉,当且仅当另外一棵树上路径pq中的任意一条边被删去,而这条路径可以通过树链剖分转化为线段树上的几段区间。...原创 2019-03-04 20:40:41 · 258 阅读 · 1 评论 -
codeforces1111E Tree
题面题意给出一棵树,多次询问,每次询问给出一个根节点和k个点,问要求将它们划分为至多m个集合,要求每个集合中不包含存在祖先关系的点,则一共有几种方法。做法考虑单次询问怎么做,可以发现一个非常重要的性质,一个点的两个不同祖先不可能在同一个集合中,因此可以先将所有点根据到根节点的距离排序,记dp[i][j]dp[i][j]dp[i][j]表示前i个集合划分为j个集合的方案数,然后可得dp转移:...原创 2019-03-14 10:09:09 · 265 阅读 · 0 评论 -
codeforces1023F Mobile Phone Network
题面题意有n个点,并给出k条还没有权值的边和m条有权值的边,要求你给这k条边赋上权值,使得存在一种最小生成树包含这k条边,问k条边的最大权 值和是多少。做法首先可以先求出这棵最小生成树,然后这m条边中的所有非树边都会与原树构成一个环,要满足它不是树边,它就必须是环上的最大值,相当于要对环上的所有树边都取一次最小值,这个用树链剖分,差分+启发式合并或可并堆…都可以做,但都很麻烦。可以发现,...原创 2019-02-26 18:51:13 · 190 阅读 · 0 评论 -
2018-2019 ACM-ICPC, Asia East Continent Finals J. Philosophical … Balance
题面题意多组数据,每组数据给出一个长度为n的字符串S,求maxi∑j=1nlcp(i,j)∗kj\max_{i}{\sum_{j=1}^{n}lcp(i,j)*k_{j}}maxi∑j=1nlcp(i,j)∗kj的最小值其中kik_{i}ki由你定,但是要满足∑i=1nki=1\sum_{i=1}^{n}k_{i}=1∑i=1nki=1,且0&amp;amp;lt;=ki&amp;amp;lt...原创 2019-03-05 17:58:26 · 582 阅读 · 0 评论 -
codeforces1129E Legendary Tree
题面题意交互题,要求你通过询问确定一个有n个节点的树的边,每次询问输出两个集合S,T和点v,将会告诉你从S集合的某个点到T集合的某个点并经过点v的路径数。做法首先钦定点1为根节点,然后发现,询问({x∈N∗x \isin N^*x∈N∗ | 2&lt;=x&lt;=n,x̸=i2&lt;=x&lt;=n,x\not =i2<=x<=n,x̸=i...原创 2019-02-25 21:47:21 · 372 阅读 · 0 评论 -
codeforces1110G Tree-Tac-Toe
题面题意给出一棵树,一些点被染成了白色,现在有两个人A,B轮流操作,A会把某个未染色的点染成白色,B会把某个未染色的点染成黑色,若出现了一个颜色相同的连通块,则对应颜色的人获胜,A先操作,则哪一方会获胜。做法首先我们考虑转化一下初始为白色的节点,若点A为白色,则我们可以新建点B,C,D,并且连边(A-B),(B-C),(B-D),并将A变为未染色的点,不难发现两者等价,现在考虑如何处理没有...原创 2019-02-22 09:45:34 · 309 阅读 · 1 评论 -
codeforces1110F Nearest Leaf
题面题意给出一棵树,它的节点的标号恰好为其dfs序,多次询问,每次询问给出三个数u,l,r,求点u到标号在[l,r][l,r][l,r]中的叶子节点的最近距离。做法考虑用线段树维护点1到各个叶子节点的距离,发现若要维护点1的儿子节点点2到各个叶子节点的距离,只要将点2的子树中的所有叶子节点的距离减去边权,其余叶子节点加上边权,这样只要将询问离线,再维护区间加和区间最小值即可。代码#in...原创 2019-02-22 08:15:50 · 238 阅读 · 0 评论 -
codeforces1118F2 Tree Cutting (Hard Version)
题面题意给出一棵一共有k种颜色的树,每个点要么没有颜色,要么是k种颜色中的一种颜色,每种颜色至少出现一次,现在要你删去k-1条边,使每个连通块中有且仅有一种颜色,问有几种删法。做法首先判断无解的情况,可以发现如果一个有颜色的点为根的子树不包括所有这个颜色的点,则这个点与其父亲之间的边不可以被删去,我们可以据此将其父亲也染为与它颜色相同的颜色。因此,我们可以进行bfs,如果这一层中有多个颜...原创 2019-02-21 20:46:43 · 350 阅读 · 0 评论 -
2015 ACM-ICPC World Finals G - Pipe Stream
题面做法我们可以发现从v2-t开始,每减去t比较一次,直到L,就可以得到答案。考虑建出二分查找树,发现每一个速度都有一个时间上限(如果超过这个时间就无法比较),这个时间就以为着它在二分树上的最大深度,可以发现每个速度的最大观察深度是一个分段函数,可以逐层考虑这棵二分树,计算它每层可以将答案精确到几个区间中,然后减掉这一层必须确定的速度(若节点数不够,则说明无解),逐层枚举,最后的深度即为答案...原创 2019-02-21 18:10:22 · 480 阅读 · 0 评论 -
UOJ #351. 新年的叶子
题面题意给出一棵树,每次随机选择一个叶子节点(可以重复选),将其染黑,问树上不经过黑点的最长链变短的期望染色次数是多少。做法这题的主要思路是用总代价除以总方案数。树的直径有一个或两个必经点,当直径长度为奇数时,直径的中点即为必经点,可以将有希望成为直径上的叶子节点根据它属于必经点的哪棵子树进行分类,得到多个叶子集合,若直径长度为偶数,则有一条必经边,根据边将有可能成为直径上的叶子结点分成...原创 2018-11-05 17:50:28 · 304 阅读 · 0 评论 -
BZOJ 4154: [Ipsc2015]Generating Synergy
题面题意给出一棵树,每个点都有一个颜色,初始为1,要求支持两种操作: 1.查询点的颜色 2.将某个点的子树内所有与它的距离小于等于L的点的颜色都修改为某个颜色。 最后输出所有操作的序号乘以操作答案的和。做法直接用线段树或者什么其他算法很难做,但可以将树上的每个点转化为一个二维坐标系中的点,其横坐标为dfs序,纵坐标为其深度,这样2操作就可以转化为修改坐标系中的一个矩形...原创 2018-07-16 14:59:57 · 355 阅读 · 0 评论 -
BZOJ4504 k个串
Description兔子们在玩k个串的游戏。首先,它们拿出了一个长度为n的数字序列,选出其中的一 个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次)。 兔子们想知道,在这个数字序列所有连续的子串中,按照以上方式统计其所有数字之和,第 k大的和是多少。Input第一行,两个整数n和k,分别表示长度为n的数字序列和想要统计的第k大的和 接下里一行n个数a_i,表示这原创 2018-03-17 15:50:47 · 413 阅读 · 1 评论 -
可修改主席树(树状数组套主席树)
作用 普通主席树可以查询区间k小值,但若直接修改,则复杂度极大,而可修改主席树通过树状数组的辅助来修改,大大缩小了时间复杂度,缺点是空间复杂度过大. 修改的时间复杂度为O((logn)^2),空间复杂度为O(n*logn^2).实现方法 为了减小修改复杂度,可以修改每个区间管理的范围. 传统主席树每个点对应的主席树管理一个前缀,而可修改主席树因为树状数组在处理动态区间和上有优势原创 2018-01-26 19:57:39 · 630 阅读 · 0 评论 -
K-D Tree
作用一种用于储存多维数据的数据结构,同时可以查询多维空间中距离它最近的一个点.做法build首先它是一棵二叉树,而每一层用不同维进行分组,标准写法是每次求出每一维的方差,选取方差最大的那一维作为比较依据(后面与二叉查找树相同),找到这一维的中位数,分成两组,然后递归建树,复杂度为O(n*(logn)^2). 但实际上可以rand()一维再rand()一个分界点,之后比它大的放左子树,比它小的放右子原创 2018-04-13 20:25:27 · 318 阅读 · 1 评论 -
世界树
题面题意给出一棵树,每次给出其中一些点成为控制点,每个点被距离它最近的控制点控制(若到多个控制点的距离相等则视为被编号最小的控制点控制),输出每个控制点控制了几个点.做法因为每次询问书树上的一些点,因此不难想到用虚树. 树上的点可以说有以下几类: 1.不属于虚树的根节点的子树的点,用n-size[root]即可求出 2.被压缩在虚树的边上的点或者属于一棵根节点被压缩在虚树的边上但不包含虚树上的原创 2018-03-26 20:36:32 · 478 阅读 · 0 评论 -
洛谷 P4092 [HEOI2016/TJOI2016]树
题面题意给出一棵树,两种操作,给节点打标记(1为根,初始仅1打了标记),询问祖先中距离他最近的打了标记的节点做法这题可以用暴力水过去,也可以用树链剖分来做. 但利用并查集可以十分巧妙地解决这题. 首先可以发现随着询问的进行,每点的答案将会被分成越来越多块,而倒过来进行的话则会发现块数将会越来越少直到最后的一块,且每次都是两块并成一块,因此我们可以记录下操作后用并查集维护,若一个点打了标记,则其父原创 2018-03-30 16:49:16 · 361 阅读 · 0 评论