首页 > 其他分享 >1.24 两道树上问题的解法与思考

1.24 两道树上问题的解法与思考

时间:2024-01-24 21:33:53浏览次数:32  
标签:log 后缀 复杂度 路径 我们 access 两道 解法 1.24

内容过于简单,勿喷。

1.1 P6072 Path(双 log)

选择两条简单路径,满足没有重合的点,且边权异或和之和最大。\(n\le 10^5\)。

我们可以把问题转化为选出一个 \(u\),令在子树内选出两个点的异或和最大为 \(f_u\),子树外为 \(g_u\),那么我们需要求 \(f_u+g_u\) 的最大值。

首先,通过 DSU on tree,我们可以搞出一种比较巨大的双 log 做法。不多赘述。

1.2 P8511 [Ynoi Easy Round 2021] TEST_68

本题需要求出所有 \(g_u\),但是复杂度单 log。

考虑如下做法:首先找到全局的最优的链 \((x,y)\)。我们发现,对于不在 \(1\to x\) 与 \(1\to y\) 路径上的点,\(g_i\) 一定是 \((x,y)\) 这条路径。

现在问题转化为对于一条 \(1\to x\) 的路径进行求解。这是容易的,考虑从 \(1\to x\) 走的时候,“子树外”这个集合是不断扩大的,暴力增加即可。

1.3 P6072 Path(单 log)

我们回到第一个问题上。现在我们已经能够单 log 求出所有 \(g\)。求出所有 \(f\) 看上去不能够利用以上解法得到单 log 解。

但是由于我们需要求的是最大的 \(f+g\)。于是对于 \(g\) 相同的 \(u,v\),若 \(v\in T_u\) 那么 \(v\) 没有任何用处。所以,我们实际上需要求出的 \(f\) 只有一些极大的子树,以及 \(1\to x\) 与 \(1\to y\) 的链。两者都是好求的,于是总复杂度 \(O(n\log n)\)。

2.1 LOJ6041 事情的相似度(双 log)

给定 01 串,令 \((i,j)\) 的贡献表示为 \(i\) 起始的后缀与 \(j\) 起始后缀的 LCP,每次问询求区间两两贡献的最大值。

通过建立后缀树,转化为区间两两 lca 的最大深度。

首先,我们有一种双 log 的做法。考虑我们在 lca 处统计贡献。进行 DSU on tree,并且在遍历轻子树时,将其在重子树中的(标号的)前驱后继找出。于是我们可以发现,有用的点对一定产生于这些中,只有 \(O(n\log n)\) 个。于是总复杂度 \(O(n\log^2 n)\)。

2.2 LOJ6041 事情的相似度(单 log)

在“本质不同子串个数”一题中,我们有了在后缀树上扫描线做 access 操作的想法。这个想法同样可以运用于这题。

考虑扫描线的同时,维护这个点的贡献。考虑每次到 \(r\) 做一次类似 access 操作,给祖先点染颜色 \(r\)。那么如果一个节点先前染色为 \(l\),那么就把 \((l,r)\) 加入点对集中。由于 access 更改次数线性,所以总复杂度为 \(O(n\log n)\)。

3 总结

讲真我觉得这两题关系不大,但是关系很大。

所以没啥好总结的吧。但是确实很有趣。以前并不熟悉这些技巧。

标签:log,后缀,复杂度,路径,我们,access,两道,解法,1.24
From: https://www.cnblogs.com/TetrisCandy/p/17985901

相关文章

  • 1.24总结
    packagecom.mediator;importcom.mediator.Annotations.CommandHandler;importcom.mediator.Annotations.EnableCommandHandler;importcom.mediator.Annotations.PipeLine;importcom.mediator.Mediator.IMediator;importcom.mediator.Mediator.impl.Mediator;impor......
  • 1.24学习进度
    1.RDD的创建通过并行化集合创建(本地对象转分布式RDD)读取外部数据源(读取文件):textfileapi(可以读取本地数据)2.算子是什么算子:分布式集合对象上的api方法/函数:本地对象的api3.算子的分类   Transformation:转换算子(返回值是rdd)特性:这类算子时lazy、懒加载的,如果没有action算子......
  • python 有效的数独 多种解法
    解法一:暴力枚举法最简单的方法是对于每一行、每一列和每一个3x3的九宫格,分别判断其中是否有重复的数字。具体实现如下:classSolution:defisValidSudoku(self,board:List[List[str]])->bool:#检查行foriinrange(9):nums=set()......
  • python 在排序数组中查找元素的第一个和最后一个位置 多种解法
    二分查找:基于二分查找的算法可以在O(logn)的时间复杂度内解决该问题。具体实现方式是,先使用二分查找找到该元素的位置,然后向左和向右扩展,直到找到第一个和最后一个位置。代码如下:defsearchRange(nums,target):defbinarySearch(nums,target,lower):left,righ......
  • python 搜索旋转排序数组 多种解法
    二分查找:旋转排序数组中仍然可以应用二分查找算法。首先,我们找到数组中最小的元素的索引,也就是旋转点的位置。然后,我们根据目标值与旋转点的大小关系,在旋转点的左侧或右侧进行常规的二分查找。defsearch(nums,target):#寻找旋转点left,right=0,len(nums)-1......
  • 面对AI革新时,Soul App等社交应用的“出圈”解法是什么?
    2023年初,ChatGPT掀开海内外互联网“AI革新”的序幕。公众在惊讶于ChatGPT对于海量信息富有逻辑的整合归纳、帮助大家提升工作及学习效率之余,更为期待的莫过于有一天人工智能的“意识觉醒”。十余年前由斯派克·琼斯(SpikeJonze)编剧并执导,讲述人类与人工智能“萨曼莎(Samantha)......
  • python 最长有效括号 多种解法
    使用栈:遍历字符串,当遇到左括号时,将其下标压入栈中;当遇到右括号时,如果栈为空,则将当前右括号下标作为新的起始点,否则将栈顶元素出栈,并计算当前有效括号的长度。Python代码示例:deflongest_valid_parentheses(s):stack=[-1]#栈中始终保持一个起始位置max_length=0......
  • python 下一个排列 多种解法
    方法一:使用内置函数Python提供了一个内置函数next_permutation,可以直接用来求解下一个排列。你可以通过导入itertools模块来使用该函数。示例代码如下:importitertoolsnums=[1,2,3]perms=list(itertools.permutations(nums))next_perm=perms[perms.index(tuple(nu......
  • python 串联所有单词的子串 多种解法
    解法一:使用递归deffind_substrings(s,words):ifnotsornotwords:return[]word_length=len(words[0])num_words=len(words)total_length=word_length*num_wordssubstrings=[]deffind_substrings_helper(s,......
  • python 移除元素 多种解法
    使用列表推导式:numbers=[1,2,3,4,5]removed_number=3numbers=[xforxinnumbersifx!=removed_number]print(numbers)#输出:[1,2,4,5]使用filter()函数:numbers=[1,2,3,4,5]removed_number=3numbers=list(filter(lambdax:x!=removed_numbe......