CF1804H Code Lock
牛逼题,但是卡常。
首先显然指针会从密码串第 个位置开始,因此我们需要关心的就是相邻两个位置的值。只需要求出 表示前一个是 ,后一个是 的个数即可。
考虑一般的按顺序填的状压,总是避免不了顺序的问题,总是与 有关,我们需要一个合适的计算贡献的方法。
首先考虑 的情况,我们称第 段为第 个和第 中间那一段。同时考虑 和第 段的出现次数,可以发现:
- 每一对 至多经过这两段总共一次。
- 当 位于两端同一侧的时候,不会经过这两段,否则会经过这两段恰好一次。因为我们计算的是总和,所以不需要考虑到底经过了具体哪一段。
那么这个问题就变得简单起来了,我们只需要知道 段这样的中间有什么即可。枚举第 段和第 段中间的集合是 ,然后设 表示当前滑动窗口的 中是什么,每次选出一个在 中并且仍然在 中的扔掉,再选一个不在 中也不在 中的加进来,计算贡献即可。这样的复杂度是 ,过不去。
如果能优化掉一个 就好了!发现两步其实是独立的,因此可以先转移一边,再转移另外一边,复杂度就变成 了。
对于 的情况,只需要计算所有左端点往后 滑动窗口的贡献,然后除以二就是答案了。
有点卡常,强制 在第一段和第 中间可以将常数变成 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2022-07-01 luogu P5279 [ZJOI2019]麻将
2021-07-01 luogu P3896 [湖南集训]Clever Rabbit