Day 12
0
T1 迷宫
Solution
注意到 n 最大只有5,我们想到用线段树维护区间[l, r]从a[l][i]到a[r][j]移动的最小路径长,储存在线段树里。
具体push_up的时候枚举中点k,得到方程
t
r
[
k
]
.
d
[
i
]
[
j
]
=
m
i
n
(
t
r
[
k
]
.
d
[
i
]
[
j
]
,
t
r
[
l
s
(
k
)
]
.
d
[
i
]
[
k
]
+
t
r
[
r
s
(
k
)
]
.
d
[
k
]
[
j
]
+
1
)
;
tr[k].d[i][j]=min(tr[k].d[i][j], tr[ls(k)].d[i][k]+tr[rs(k)].d[k][j]+1);
tr[k].d[i][j]=min(tr[k].d[i][j],tr[ls(k)].d[i][k]+tr[rs(k)].d[k][j]+1);
update的时候直接修改a[i][j]的值,再从修改的点一路push_up就好,这样就将所有包含修改的点的区间全部更新了一遍。
query时要注意,如果要查询的区间[L, R]不完全包含在[l, mid]或[mid+1, r]中,还是要将[L,mid]和[mid+1, r]合并一下的。
合并工作和push_up一样。枚举中点k转移。
一开始拿到这道题想到是数据结构,但是没有什么思路。
问题还是在我对一些基本数据结构的理解不够深,换一种不常见使用方式就不熟悉怎么去做了…
还有,这题分块可以拿到不错的分数(80?),考试的时候也没有去尝试。