zoukankan      html  css  js  c++  java
  • 高维前缀和(后缀和)

    高维前缀和(后缀和)

    Method1

    可以直接容斥, 式子形如 :

    (f_{a, b} = f_{a - 1, b} + f_{a, b - 1} - f_{a - 1, b - 1} + g_{a, b})

    (f_{a, b, c} = f_{a - 1, b, c} + f_{a, b - 1, c} + f_{a, b, c - 1} - f_{a - 1, b - 1, c} - f_{a - 1, b, c - 1} - f_{a, b - 1, c - 1} + f_{a - 1, b - 1, c - 1} + g_{a, b, c})

    (f_{a, b, c, d} = f_{a - 1, b, c, d} + ... - f_{a - 1, b - 1, c, d} - ... + f_{a - 1, b - 1, c - 1, d} + ... - f_{a - 1, b - 1, c - 1, d - 1} + g_{a, b, c, d})

    如果由前缀和(后缀和)逆推的话, 式子(也许)差不多吧

    这样子的做的时间复杂度是 (O(n^t2^t)) 的 (t 为维数, 一次容斥的时间复杂度为 (2^t))

    Method2

    分别对于每一维求一次前(后)缀和, 例如三维前缀和 :

    fo(i, 1, n) fo(j, 1, n) fo(k, 1, n)
        f[i][j][k] += f[i][j][k - 1];
    fo(i, 1, n) fo(j, 1, n) fo(k, 1, n)
        f[i][j][k] += f[i][j - 1][k];
    fo(i, 1, n) fo(j, 1, n) fo(k, 1, n)
        f[i][j][k] += f[i - 1][j][k];
    

    这样子写虽然看似比较繁琐, 但是时间复杂度仅为 (O(tn^t))

    逆推的话也十分简单, 基本就是把上边过程反过来即可

  • 相关阅读:
    json schema相关
    好看的记录片和电影
    java函数局部变量的坑(非常隐藏)
    maven操作
    Js数组的常用的方法概述
    深入理解JS各种this指向问题
    浅谈ES5和ES6继承和区别
    vue
    使用 vue-i18n 切换中英文
    js_数组对象的浅克隆
  • 原文地址:https://www.cnblogs.com/zhouzj2004/p/13893722.html
Copyright © 2011-2022 走看看