jz集训 8.12

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?),考试的时候也没有去尝试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值