蒟蒻求助(动态dp模板亿点不明白的地方)
  • 板块学术版
  • 楼主perish
  • 当前回复3
  • 已保存回复3
  • 发布时间2020/11/2 21:53
  • 上次更新2023/11/5 09:10:08
查看原帖
蒟蒻求助(动态dp模板亿点不明白的地方)
226418
perish楼主2020/11/2 21:53
  inline void Push_up(int i) {
    M[i] = M[i << 1] * M[i << 1 | 1];
  }

  void build(int left, int right, int i) {
    L[i] = left, R[i] = right;
    if (L[i] == R[i]) {
      M[i] = val[dfn[L[i]]];
      return;
    }

    int mid = (L[i] + R[i]) >> 1;
    build(L[i], mid, i << 1);
    build(mid + 1, R[i], i << 1 | 1);
    Push_up(i);
  }
  void update(int x, int i) {
    if (L[i] == R[i]) {
      // 直接赋值,减小常数
      M[i] = val[dfn[x]];
      return;
    }

    int mid = (L[i] + R[i]) >> 1;
    if (x <= mid) update(x, i << 1);
    else update(x, i << 1 | 1);
    Push_up(i);
  }

  // 查询一个点的 DP 值,相当于查询这条重链上链尾矩阵和链中转移矩阵的 '*' 积
  matrix query(int left, int right, int i) {
    if (L[i] == left && R[i] == right) return M[i];

    int mid = (L[i] + R[i]) >> 1;
    if (right <= mid)
      return query(left, right, i << 1);
    else if (left > mid)
      return query(left, right, i << 1 | 1);
    else
      return query(left, mid, i << 1) * query(mid + 1, right, i << 1 | 1);
  }




上面是某篇题解中的动态dp的线段树部分 但是蒟蒻有一点没明白的是:

矩阵乘法应该是从链尾乘到链头才是正确的顺序,但上面的线段树从小到大乘(也就是从链头乘到链尾)

但是却是正确的,请问是为什么呢?

2020/11/2 21:53
加载中...