Codeforces Round 914 (Div. 2)
1|0基本情况
脑子最卡的一集。
A题读假题,卡了快一小时。
B题代码太复杂,出错不好修改,一直调。
虽然最后都出来了,但是没有剩下任何时间看后面题目了。
2|0A. Forked!
一开始不知道犯得什么病,觉得可以斜着走一格算作一步,然后情况就太多了,非常不好处理。
后面突然想着有没有一种可能不能斜着走,然后问题就很简单了。
枚举皇后、国王各自身边的八个位置,看看八个位置中重合的数量即可。
3|0B. Collecting Game
3|1最初
显然要用前缀和,但是仅限于此了,再加了几个比较无脑的剪枝,然后T了。
3|2优化
观察了一番,感觉这一段有很大的优化空间:
这一段的目的是找到所有的能被删除的数,但是我很朴素地删一个,加一个。
完全可以用二分查找先快速找到最后一个小于等于当前和
复杂度从
3|3改错
话虽如此,但是这个代码是错的!导致我调了半天。
这玩意求得是第一个大于
的值的下标。
这是我的第一反应。然后顺着这个思路,自然而然,最后一个小于等于当前
然而真正第一个大于 std::upper_bound(b + 1, b + n + 1, tot)
啊喂。
又因为我从 b+1
这个数组下标一地址之后,实际上返回的是它们之间的差值,说白了,也就是已经是真正第一个大于
所以直接 tot = s[t]
就行了。
但是这样不够优雅。
直接直来直去最明白:
-
先求第一个大于
的下标:t =std::upper_bound(b + 1, b + n + 1, tot) - b;
-
再转成最后一个小于等于
的下标:t--;
-
然后直接用就行:
-
3|4代码
最后再把之前口胡的剪枝都删掉,搞得简洁一点。
__EOF__

本文链接:https://www.cnblogs.com/kdlyh/p/17892647.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下