jz集训 8.12

Day 12

0

T1 迷宫

在这里插入图片描述
在这里插入图片描述

Solution

注意到 n 最大只有5,我们想到用线段树维护区间[l, r]从a[l][i]到a[r][j]移动的最小路径长,储存在线段树里。
具体push_up的时候枚举中点k,得到方程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?),考试的时候也没有去尝试。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章