ABC 389(EF)

E

一道感觉非常巧妙的二分。

可以将每种商品分开来看:第k次买商品Pi时,价格为(2k1)Pi

这样,就将每种商品拆分为了多个实体的商品,并有自己的价格。想最大化购买物品的总数,一定是每次购买时贪心选择当前所有物品中最便宜的那个。

但模拟一定会TLE,可以枚举购买过程中买的最贵的一件商品,设其价格为x

显然x是具有单调性的,故每次可以二分x,若能买完价格<=x的所有物品,则可买的最大价格的真实值一定比x要大,扩大左边界;若价格<=x的物品不能全部买完,则真实值一定比x要小,缩小右边界;

将所有<=x的商品购买完后,若剩下一些钱,则要买价格恰好为x+1的物品,不需要考虑x+2及以上价格的物品,因为若考虑了则说明价格<=x+1的商品能全部买完,会直接增大x并进入下一轮二分,直到最后会停在某一个x,使得所有<=x的物品全部买完,而所有x+1的物品未买完。

注意二分边界要足够大,因为可以购买的最大价格不止是原商品的最大价格,容易遗忘!

code

F

考虑对每一个X计算答案。初始时没有经过任何区间,答案为[1,2,3,...,5e5]

枚举要经历的区间,由于每经过一个区间[l,r],值位于[l,r]内的X会加1,则在经历任意一个区间后,可以保证答案序列的非递减性。

因为对于任意Xi<Xj,在Xi不断递增的过程中,由于每一次只会加1,故递增时不会突然发生Xi>Xj的情况,最多只会等于Xj,那么以后二者的变化就会永远相同,不会发生突变的情况。

所以每经历一场比赛,会增加的X在答案序列中一定也会呈现为一个区间的形式,这样就相当于区间加,可以用线段树二分来找要加的区间的左右端点,最后回答每个询问即可。复杂度O(nlog2X+QlogX)

code

posted @   jxs123  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示
主题色彩