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的线段树部分 但是蒟蒻有一点没明白的是:
矩阵乘法应该是从链尾乘到链头才是正确的顺序,但上面的线段树从小到大乘(也就是从链头乘到链尾)
但是却是正确的,请问是为什么呢?