CF702F T-Shirts

cf

luogu

暴力是挨个考虑,这里不妨整体考虑,先把所有T恤按照价值从大到小为第一关键字,价格从小到大为第二关键字排序,然后依次考虑,可以发现这时候剩余钱数\(>c_i\)的会买,这会导致他们钱数\(-c_i\),答案\(+1\).因为这一段人是连续区间,所以考虑用平衡树维护,每次找到钱数\(.=c_i\)的点,打上减钱数和答案\(+1\)的标记,再和其他点合并成新平衡树

不过直接这样做显然是假的,如果很多人每次都买了T恤,那么复杂度会有\(O(n^2logn)\).所以进一步的可以发现如果钱数\(\ge 2c_i\)的人,合并之后他们之间不会插入其他人.那么就先把钱数\(\ge 2*c_i\)的人拎出来,打好标记,然后对钱数在\([c_i,2c_i)\)之间的人修改完后全部暴力合并到前面钱数\(<c_i\)的人里,然后把之前钱数\(\ge 2*c_i\)的人直接接到后面.注意到钱数在\([c_i,2c_i)\)之间的人每次钱数都会减少至少一半,所以一个人最多被暴力插入\(log_{b_j}\)次,复杂度就是\(O(nlognlog_{\max b_j})\)

然后splay被卡爆了,所以先放个被卡代码,学了Treap再来补qwq

上一篇:python 等分 整数 列表


下一篇:学习笔记244—在 Mac 上的“访达”中更改显示选项