8.15前部分题目题解

近期有很多没见过的神奇套路,大概记录下吧。
8.6:
BB:将答案统计转化。
f(u,v)表示u是否支配v。
将所有节点分成两个集合,一个是S,第一个人选的点,T,第二个人选的。
那么考虑总体答案:

uSvTfu,vuSvTfv,uiSwi

=uSvTfu,v+uSvSfu,vuSvSfu,vuSvTfv,uiSwi

=uSszudepuwu

那么每一个点造成的贡献就是szudepuwu按照这个值将所有点排序然后选取奇数点得到答案。
8.7:
桥桥:操作分块与可撤销并查集。
考虑每个点怎么暴力,就是把所有的当前时间的小于该点重量的边全部加入并查集然后查询该点所在集合的大小。
那明显不行,O(mq)的复杂度,但是可以发现更改的复杂度与查询的复杂度不均等。
想办法去将整体复杂度进行调整,发现在整个区间内部如果没有修改,就直接排序然后按重量大小依次加边处理查询。
那么我们将所有操作分块,这时块内改变的边有q个,这时按照查询重量大小排序查询,然后按照时间点排序修改。
然后将每个查询时间前不改变的边暴力加入,剩下q个边单独处理。
单独处理时就需要并查集撤销操作,只能用按秩合并,所以合并是O(log n)的。
所以这时O(mlog n)块内查询复杂度,O(q)更改复杂度。
整体复杂度按n,m,q同阶计算,是O(nnlog n)的。
8.8:
春色春恋春熙风:树上启发式合并。
可以看出状压,同时找匹配也可以想得到,那么考虑暴力将子树依次加入,统计匹配答案。
但是单次对子树依次加入并清空是O(22n2)的。
考虑能不能省略一些无意义过程,发现第一棵子树在加入时不会对父亲造成任何贡献。
这就意味着事实上我们可以继承一个儿子的匹配信息(字典),然后让其他子树依次统计并加入。
明显要继承重儿子的信息。
这就是树上启发式合并了,因为一个点集信息要移动到另一个点集中要求另一个点集的大小>=它,所以移动次数是log2级的.
那么这个时候整体复杂度就是O(22nlog n)的。
8.11:
Mortis:转化信息与环。
考虑什么情况下操作最优,明显就是最终状态下有两个数的位置相异,这时直接操作使两个点都归位。
那么三个点构成一个相异环时,两步操作可以使三个数归位,效率为3/2。
四个点也是类推即可。这时发现所有的点之间的关系都只有这三种可能性,所以依次统计并记录答案。
嘉然今天吃什么:01trie与排除无用信息。
明显不考虑限制时求一个最大异或值,这就是白板01trie。
考虑什么节点的答案可能不是整体的最大异或值,就是选入的那两个节点之间的链所有点,他们都不能直接选它们俩。
所以整体先用01trie将整体异或最大及由哪两个节点获得的信息得到,然后去将两个节点间的整个链单独处理。
那么从根节点一路扫下来,然后每下一层将除了进入的子树外的所有点加入trie树,然后子树统计答案。
这时整体复杂度是O(n)的。
8.12:
那一天她离我而去:分组最短路。
考虑最暴力做法,依次把每个点与1的边断掉然后跑单源最短路看该点到1的最短路。
然后转化一下,其实就是求所有与1直接相连的点之间不经过与1连的边最短路,然后加上连向1的边的大小。
考虑优化暴力,发现所有点的编号可以用二进制来表示出来,因为点的编号相异,所以二进制位一定都有所不同。
那么将点编号同一个二进制位为1/0的点分成两组去跑最短路,建立一个源点向第一组连边,然后汇点向第二组连边。
这样依次按二进制分组跑源点到汇点的最短路,最终所有的情况都会被枚举到,复杂度O(m log2n)
哪一天她能重回我身边:基环树,换根dp,图论建模。

posted @   SLS-wwppcc  阅读(8)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示