zoukankan      html  css  js  c++  java
  • bzoj2002

    这道题学习了一种简洁的解决一些数据结构题的方法——分块法
    这道题方法很多,但分块写起来只有1kb左右,非常的简洁(但不是非常的高效)
    首先很容易思考到一种暴力的做法,从后往前推,很容易搞出每个点会弹几次弹出,
    这样询问是O(1),但修改一个弹力系数必须把之前会弹到这个点的步数都要修改,因此我们使用分块优化
    我们把数列划分成一个个大小为[sqrt(n)]的块(最后一块大小具体计算),
    令f[i]表示弹出i所在块所用的次数,p[i]表示最终弹出i所在块后弹到下一块的位置
    首先f[i],p[i]都是可以预处理出来的
    然后查询,显然我们只要最多遍历块的个数 是O(sqrt(n))
    修改,我们只要修改这个点之前,且属于同一个块的点即可,最坏也是O(sqrt(n))
    这样总的复杂度为O(m*sqrt(n))

     View Code

  • 相关阅读:
    DbgPrint格式 输出
    string 类常用函数[转]
    pragma warning[转]
    连接符
    ubuntu ftp server
    关于dex

    Topology中各函数调用顺序
    C# 错误捕捉
    操作word,Excel,PPT
  • 原文地址:https://www.cnblogs.com/phile/p/4473126.html
Copyright © 2011-2022 走看看