CF DS题做题笔记(持续更新)
CF DS题做题笔记(持续更新)
题目来源:Codeforces 的 problemset内,difficulty 2300-2600,并包含“data structures”的 tag。
1681F
题意:给定一棵树,边有边权
分析:考虑求出每种边权对答案的贡献,将某条权值为
将
考虑能使
显然,路径的一端要在
如果将所有权值为
直接做时间复杂度为
定义
由于并查集要可撤销,故不能路径压缩,运用按秩合并保证复杂度,总复杂度为
此外这题可以用 LCT 求解,枚举到某一个权值,先将对应的边删除,求解,再加入,LCT 中维护树的大小即可,复杂度
1625D
题意:给定
分析:如果两个数异或结果的最高位比
对每一组分别求解,容易发现每一组最多只能选上
设目前处理的那一组的数为
注意每一组求解完成后要清空 trie,不能 memset,要一个一个删除。
时间复杂度
1575I
题意:给定一棵树,点有点权
分析:考虑化简一下边长的表达式:
,显然边长为 ; 显然边长为 ; ,这个可以感性理解下, 可以看做在数轴上将 右移 单位长度, 可以看做在数轴上将 向左平移 单位长度,由于 ,所以边长为后者,即 ; ,根据绝对值的性质,边长可以写做 ,与情况 同理,可得边长为 ,即 ;
综上,
设
注意在查询前判断
时间复杂度
1528C
题意:给定两棵树,求一个最大的集合
分析:考虑从第一个条件出发,要想满足第一个条件,所有点一定是在树上的某一条深度不断递增的链上,一次 dfs 可以求出所有的链。
现在的问题是怎么满足第二条链,一个很显然的方法是,当选择一个点时,将第二棵树中它的祖先和子树内所有点打上标记,这个可以用树链剖分,但是很麻烦。
考虑将祖先关系对应到 dfs 序上来,定义
- 没有上述区间,则选择
。 - 有被
包含的区间,此时不选择 ,这样不会使得答案变大,且会造成更多的非法节点。 - 有包含
的区间,删除包含它的区间并加入 ,虽然不会使答案变大,但是会减小非法节点的数量。
注意回溯的时候要撤销标记。
判断区间的包含关系可以用线段树解决,总复杂度
1508C
题意:给定
分析:很显然,赋权时,只需要将一条边赋成给定权值的异或和,其余赋
当存在
现在的问题转换为如何求一个大多数边权均为
顺带提一句可以省去小数据枚举的方法,在跑 Kruskal 的时候记录哪些边被选上,跑完后重置 dsu,按边权从小到大排序,找到第一个连接两个不同连通块的边,且在第一遍 Kruskal 时没被选上,这样就可以选上它替代掉一条
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现