时间安排
8:00–8:05 读题,T2又是一个利用随机化的题,T3题面又臭又长,一道题目里面套娃了两道题,还必须用出题人所设计的语言编写,直接弃掉T3。
8:05–8:10 T1,n<=1e4的时候,随便一个排列就是对的。
8:10–8:35 T2,对于P比较小的时候可以01背包,由于数据范围比较宽松,可以直接用bitset。输出处理比较麻烦,需要翻译成16进制,为了检查还得自己写一个SPJ。因为搞错了高位和低位的顺序,调了一阵子。
8:35–8:50 T2,对于Q<=100,感觉比较小,可以直接rand答案,直到取到解。
8:50–11:30 T1,重新审视题目,实际上是要求子树sz差最小,对于两个子树,要么包含,要么不交,那么只要判断一下lca就可以快速计算贡献。于是写了一个ST。如果只有一个数列,可以贪心的考虑,计算出每个点的重儿子,一遍dfs求出答案。但是两个序列怎么办?两者不是独立的,而如果同时考虑两者的影响几乎没有综合的可能。能否在贪心的基础上调整?自己造了一组随机数据,发现这样根本行不通。
11:30–? T1,突然发现自己写的很多地方浪费了大量性能。由于特殊性,要找包含关系根本不需要把lca求出来,直接比较dfn就可以了。贪心考虑儿子贡献大小时也需要sort,因为如果一个数字多次出现肯定连续地选最优,那么对于奇数个,必然选重儿子,所以直接处理重儿子,然后有先取重儿子就可以了。经过以上操作复杂度降低了一个毫无意义的多余的log。但这并没有解决根本问题。
?–? 吃午饭。
?–12:40 T2,考虑随机会带来什么性质,均匀分布,那么这对组成答案有什么帮助呢?
12:40–13:00 T3,发现直接提交下发文件能拿到一定分数,于是把下发文件提交了。
回顾&反思
T1:一个很妙也是很关键的idea:那就是题目本质是让求双子树莫队。莫队的特点是什么?尽量减少不同询问之间转移的花费。对于这道题,给出若干数对,要求最小化排列相邻两对的差花费,就相当于给出若干有关子树sz的询问,且是二元询问,要求最小化询问之间转移的花费!!!更抽象的说,每个询问是一个点,点与点之间两边的权值就是转移的代价,如果能够构造出最优的图(其实这道题是树),就可以直接遍历得到答案了!!套路的,对树进行分块,本质是对询问分成根号块组,那么每个组内部花费均摊 O(nn)O(n\sqrt n)O(nn) 级别,那么把同一组的看成一个大点,只需要再处理号这些大点的转移就可以了。根据重儿子的思路,求出每个分块的重儿子,对于一个点优先考虑重儿子,这样代价就会比较小,整体花费是 O(nn)O(n\sqrt n)O(nn) 级别。
T2:依旧是分块思想,考虑将一个树分成若干组2^5级别的小树,对于240个A也分块分别负责一部分,用hash暴力处理数值的存在。因为数据随机,且每个252^525分配了40位数字(上界2402^{40}240级别),所以能找到对应数字的概率很大可以视为要找的数字总能找到(虽然感觉非常的扯),匹配的效率是比较高的。然后分组暴力就可以了。
T3:还不会。
感觉T1很妙,也算是深入了对于莫队的理解吧。比赛的时候只是看到了题目所给的数值关系,没有转化模型,忽略了莫队的本质,进而就无从谈起建图了。对于模型转化着一块还是要抓。
感觉分块套路自己还是掌握的不太好,要么根本想不起来有分块这个东西,要么不知道怎么用分块维护,要么有想法但是忽略了时间复杂度的均摊,其在缩小规模、优化暴力甚至是分治等应用以及复杂度均摊的分析要学习。
博主分享了在算法竞赛中遇到的三道题目,主要探讨了如何运用莫队算法解决子树大小最优化问题,并通过分块思想处理树结构数据。在T1题目中,发现了利用重儿子优化复杂度的关键,而在T2题目中,通过随机化和分块策略解决了数值分布问题。尽管T3仍然未解,但博主对模型转化和时间复杂度的思考有了更深的认识。
2595

被折叠的 条评论
为什么被折叠?



