zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    SQL注入方法之:获取列名
    手把手教会你模拟退火算法
    我的G++编译选项
    编译器优化误解程序员的意思
    ZKW线段树
    扩展欧几里得算法
    快速幂
    乘法取模
    莫队算法良心讲解
    高精度模板
  • 原文地址:https://www.cnblogs.com/smyjr/p/11509056.html
Copyright © 2011-2022 走看看