Atcoder abc243
https://atcoder.jp/contests/abc243/tasks
Ex - Builder Takahashi (Enhanced version)
给定S
,G
,O
,.
组成的高h,宽w的矩阵, 其中S和G分别出现且仅出现一次
S起点
G终点
.
可以建墙
O
不可建墙
四临移动
问
- 最少建立多少墙可以让无法从S到G
- 满足最少墙时的方案数 mod 998244353
范围
h [2,100]
w [2,100]
4s
1024mb
我的思路
首先想到的是 直接建一个竖着或这横着的, 这样隔开就行了
又想到, 直接把起点或者终点围起来
那么问题就是能不能围住
那么先不管多少, 就把所有能建的全建立完, 那能走的只有4临可达的不能建的
所以判断能否很好判断
那么就是 最小代价的围
感觉不会超过100
但想了下要是能建立的是个蛇形, 那还是会很长接近平方
反正问题变成平面上一堆4临连在一起的S, 和一堆4临连在一起的G
要画圈/线 把两堆隔开, 然后有些不能画线的地方
1 |
|
注意到虽然 不能画的x与s不相连, 但是依然可能影响围住s的大小
没啥想法, 感觉直接围起来 保证不了最小
1 |
|
如果围完以后, 找 两点最短更新,需要保证包裹住
需要A星 一类的启发式吗?
但如果上了启发 后面统计又不太行了
甚至可能包裹和 隔断等价
1 | g |
没有头绪
题解
还是说 需要找个8临路径/环 把其中一个框起来
然后是如何操作
先任意找一条S到G的路径, 图中橙色
然后考虑路径上方可达的方块集合, 蓝色
井号是一个建立墙的方案(还没有考虑最小
一个有效分割方案 是 墙的线 跨过 橙色/蓝色的分界处奇数次!!!!!, 上面途中是3次
神奇 , 这是离散状态下的跨过!!
因为如果是非离散的, 其实就是两点之间的连线, 如果不重叠不相切, 那么就是交点为奇数个
而这里是离散的路径,所以通过两个贴在一起的有效路径, 其拼接的地方就可以看成线, 跨过就是一个交点
然后 变成最短路问题?
因为连接的路径至少要被断开一个
那么遍历橙色上的点(x,y),对于给定的(x,y)
dp[i,j,f] = {从(x,y)出发走到(i,j,穿过线的次数奇偶性为f)的最短路的长度, 方案数}
然后 ans= d[x,y,1]
两个问题
是如何保证没有重复的走过的位置?
虽然如果一个走的序列有重复, ....x...x...
, 可以把中间的....x
去掉, 是这里有奇偶性, 直接去掉是不合逻辑的
假设中间这一段是偶数次穿过, 那么显然可以去掉 总的奇偶不变 路径更短, 因此可去掉
假设中间这一段是奇数次穿过, 那么不能去掉, 但是这一段就是一个解, 比整个短, 所以虽然不能去,但这个方案肯定不是最短 方案,也不影响答案
不同的x,y选择时之间怎么保证没有重复统计?
1 | ### |
比如图中的两个问号?可能同时选为#
那么用一个方案中经过的最小橙色作为标识, 也就是 在计算时把前面的橙色置为不可放置就行了
坑
wa x 3
https://atcoder.jp/contests/abc243/submissions/36080360
问题在于不是圈是 拼的边怎么算
我把外面的 看作一个特殊点 大圈, 但是下面这种会重复统计.-.
和 .-外-.
1 | 4 6 |
然后直接考虑边界到边界, 注意重复处理, 两个点相邻且不跨色时 只统计一次, 不相邻的两个边界点或者相邻但是跨色的, 可以 通过边界完成不跨色
代码
https://atcoder.jp/contests/abc243/submissions/36080884
1 |
|
总结
Ex
离散下的线交点
然后 这个环的个数也很神奇, 因为就算给了我这样构建图, 我虽然能想到这样的dp方向, 但是重复点的问题 直接想不出,只有给出了然后去证明