【题解】集合操作
题意
定义一个可重集合 s
,一次操作为将 s
中最大值减去 p
。
小 L 想知道,如果给你 s
和 p
以及操作次数 k
,你能求出最后的集合吗?
k<=10^18
。
Solution:
因为思路比较有借鉴意义,所以写了。
首先 k
的范围不允许模拟。考虑到最大值有单调性,所以二分最终序列最大值,因为每次减去的数一定,可以直接算。可以证明剩下的操作不超过 n
次,暴力枚举即可。
第二种思路是二分临界点。考虑 Max-Min<=p
的情况,此时每次操作最大数时都会放在队列末尾,显然具有单调性。
于是我们想到二分 i
值,我们发现 i=n
时一定成立(因为 i
第一次被取出说明其他数都减的比它小且不超过 p
),所以只需要判断第 i
个数第一次被取出时是否 Max-Min<=p
即可。常数较小。
进一步发现没必要二分,直接减到比 a[n]
小即可。
讲到单调性,来看这道题:
小L的疑惑
结论:不能支付的面额可以表示为 t-xa-yb(x>=0,y>=0)
其中 t=ab-a-b
。
由于 k<=10^7
,通过分析单调性,可以得到线性做法:
维护两个队列,初始将 t
放入 a
队列,每次取出两个队首最大值,如果是 b
栈就放入队尾,a
栈则放入两个栈的队尾,由于每次入栈的规则相同,而答案单调递增,所以两个队列具有单调性。
上述做法可以扩展到 n
栈的做法,时间复杂度 O(nk)
。
__EOF__

本文作者:仰望星空的蚂蚁
本文链接:https://www.cnblogs.com/cqbzly/p/17530315.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/cqbzly/p/17530315.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」