• 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

  • 相关阅读:
    软件工程第一周开课博客
    求数组的子数组之和的最大值
    学习进度_第二周
    当堂测试感受
    寒假生活体验
    家庭记账本七
    《人月神话》阅读笔记3
    家庭记账本六
    《人月神话》阅读笔记2
    寒假福利2
  • 原文地址:https://www.cnblogs.com/phile/p/4473126.html
Copyright © 2020-2023  润新知