CodeForces 1098D. Eels

题目简述:对一个非空正整数(可重)集合$S$,从中选出两个元素$a, b (a \leq b)$,将他们从$S$中删除并将$a+b$加入$S$,重复这个操作直到$S$中只剩下一个元素为止,称为一次【竞技】。若一次操作中$a \leq b \leq 2a$,则称这次操作是【危险的】。一次竞技的【危险值】为其中【危险的】操作的次数。定义这个集合$S$的【危险值】(记作$\text{danger}(S)$)为:所有可能的竞技的【危险值】的最大值。设一个集合$S$初始为空集,维护以下操作:

1. 插入一个数$1 \leq x \leq 10^9$。

2. 删除一个(已有的)数$1 \leq x \leq 10^9$。

每次操作后,计算$\text{danger}(S)$。

解:code

对$x \in S$,定义$S$中比$x$小的数之和为

$$ f(x) = \sum_{a \in S, a < x} x. $$

令$S$中满足$2f(x) < x$的$x$的个数为

$$t = \sum_{x \in S} [2f(x)<x]. $$

观察1:$\text{danger}(S)=|S|-t$。

猜你喜欢

转载自www.cnblogs.com/TinyWong/p/10352896.html