牛客寒假基础算法训练营1(EFIKLM)
赛时
E
这道题赛时做出来了,但看题解时看到了一个值得学习的重要结论。
结论:要将一个数组中的所有数变为相同的数
(若不知道这个结论做这个问题,可以将所有数当成若干在数轴上的点,固定点为
证明:由括号内容可知最小代价和最终值的二元函数呈山谷形,故这个最终值一定是唯一的。假设这个值不是
时,数组中比 小的元素个数 比 大的元素个数(中位数的性质),前者通过加 达到 ,后者通过减 达到 。则将 减少 ,会使所有比 小的元素各减少一个代价,同时会使所有比 大的元素各增加一个代价。由于比 小的元素个数比 大的元素个数多,故总代价是减少的。因此最优解一定 。 时,与 完全类似的证明,可以证得最优解一定 。
得证。
F
双指针 + 前缀和技巧
要想用传统的“枚举右端点,二分左端点”的套路统计贡献,就必须要发现一些单调性。而可以发现,对于固定的右端点,左端点越偏左,子区间内包含的数的种类就会越多。而所规定的子区间恰好要满足包含种类数为
可以用
剩下的问题就是要判断子区间内两种数的数量是否相同。这里有个比较巧妙的
可以发现,只需要顺序遍历序列,对于不同的数,
维护区间内的前缀和数组信息时要特别注意
I
K
与F题做法类似:区间
而还要记住区间
证明:对于某个特定的右端点
这样,对于每一个右端点统计贡献时,就可以暴力寻找每一个左端点,当然也不是纯暴力,需要利用
这样,问题就转化为:已知若干 右端点固定,左端点连续 的区间
不难想到前缀异或和来优化这件事情,即对于区间
由异或交换律,将
问题转化为求左端点
L
M(不会证明)
被
首先有个结论:最小值是一定要乘2的。这个证明到现在还是不太会,只能靠感性理解。
知道了这个结论,就不难想到每次从最小值位置开始,暴力地向次小值位置扩展区间并更新答案。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战