2022.11.15 闲话
看到有些人手动循环展开,其实可以用预处理器直接循环展开 .
具体就是 #pragma unroll <num>
,用法详见百度 .
今天的闲话主题是 BFS,真是越来越水了,回想一下第一篇闲话 Divisor Summatory Function 预处理优于 的那两个解法还挺有价值的,现在这个 BFS 都成 CSP-J 难度内容了 .
而且昨天 joke3579 写了个图论专题,全方面吊打我啊 .
APJ 指出题目名最好不要和 APJ 有关
给 个长度为 的 01 串,需要构造一个长度相同的 01 串,最大化该串和给出的串中不同位数之和 .
, .
建一个有 个点的图,每个点都与和自身只有一位不同的点连一条长度为 的边,然后 BFS 跑最长路即可 .
时间复杂度 .
令 表示十进制下 的数位之和,给一个正整数 ,求使得 最小的 ,只需输出 .
.
考虑所有正整数数都可以从 开始进行有限次乘 或者加 完成 .
要维护的是数位和,则一次乘 贡献 ,一次加 贡献 .
于是每个正整数当成一个点,乘 连边权为 的边,加一为边权为 的边,这样问题变成了最短路(合法性:显然因为最短路的最短性所以不能用 个加一顶替一个乘 ).
还有一个 的倍数的限制没管,观察可以发现把每个数都模 ,然后算一下 到 的最短路即可,这样其实点数就变成 了 .
于是可以 01BFS,时间复杂度是 的 .
给一个序列 和它的两个子串 ,每次可以在 的开头或末尾加或删一个数字,并且要满足任意时刻 为 的非空子串,求把 变成 的最少次数。
.
找到 和 的最长公共子串 ,若 非空那么答案显然就是 ,就是将 先删到 再加回来 .
若 为空,贪心地考虑,则一定是把 删成只剩一个数然后用一些操作让它变成 的子串然后加回去 .
考虑对于所有 ,连边 ,则问题变成 在 和 中分别选两个点 ,使它们之间的最短路最小,这个多源 01BFS 即可 .
做完了,时间复杂度 .
给一个无向图,每次查询的时候给一堆二元组 .
求图中有多少个点 与至少一个这次询问给出的二元组 满足 , 表示这两个点在图中的距离 .
如果不连通 .
,, .
这题其实有点搞笑,和 BFS 没太大关系 .
首先 遍 BFS 求出全源最短路 .
然后我们就可以算出从每个点 出发,最短路恰好为 的点的集合,前缀或一遍就可以得到不大于 的集合(用 std :: bitset
存一下).
询问的时候直接 bitset
暴力并一下即可,时间复杂度
以下是博客签名,正文无关
本文来自博客园,作者:yspm,转载请注明原文链接:https://www.cnblogs.com/CDOI-24374/p/16889532.html
版权声明:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议(CC BY-NC-SA 4.0)进行许可。看完如果觉得有用请点个赞吧 QwQ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】