加载中...

ABC 389(EF)

E

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

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

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

但模拟一定会\(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\),则在经历任意一个区间后,可以保证答案序列的非递减性。

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

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

code

posted @ 2025-01-20 20:40  jxs123  阅读(43)  评论(0)    收藏  举报