题解 CF2247F Paths on a Grid
题解 CF2247F Paths on a Grid
其他题
仍然感谢@StarSilk 大神提供做法二。
题意
给定
数据范围:多测,
做法一
:::info[我毫无头绪。] 考虑能在同一好的集合内的两格应该满足什么条件。 :::
:::info[所以是什么条件?] 经过它们的路径集合相等。 :::
:::info[该如何转化?] 考虑将包含关系建边,则同一个强连通分量内可以任选,不同强连通分量间不能同时选。考虑暴力建边,但你发现边数爆了。 :::
:::info[该如何优化?] 只分别连向左上和右下离自己最近的、包含自己的格。向左上连的边和向右下连的边会分别形成一棵树。 :::
先读提示。
因为我们将边解读为集合的包含关系之后就显然有传递性,所以可以只分别连向左上和右下离自己最近的、包含自己的格。以左上为例,如果左或上只有一边能走则一定得走,直接从它连过来即可;否则从左侧格和上方格的 LCA 连过来。
这样边数是
这有 *2800 我吃。
做法二
前两个提示同做法一。
:::info[该如何转化?] 判断集合相等的一种常用手段是哈希。 :::
先读提示。
路径可以视为格子集合,所以首先给格子赋随机权值,然后路径就是集合哈希。然后经过一个格的路径可以分成左上、本身、右下三部分,所以从左上和右下分别开始 DP 可以分别求出左上和右下的方案数及权值和,然后乘起来就得到了完整的集合,然后随便拿点什么(比如 map)维护一下就行了。复杂度看你实现。