[CF 2097B] Baggage Claim
前言
不要浪费时间
实在不行就去问
静下心来
不要被时间干扰
思路
要求确定所有两点之间的辅助点方案数
不难发现约束来源于辅助点的重合
考虑先把确定的辅助点处理了, 可以类似拓扑处理
如果一个点被确定占用了, 那么所有其他可能占用他的点的度数 \(-1\), 如果出现度数为 \(0\), 那么直接无解
考虑剩下的点
注意到还是有约束, 如果一个辅助点被占用, 那么剩下的可能占用他的点的度数 \(-1\)
考虑对这个约束建图, 也就是只要两个点属于一个间隔, 那么就连边, 表示一旦确定了一个点, 那么剩下的点也就确定
考虑每个连通块
- 一个环 / 基环树
显然为 \(2\), 因为可以选择两种顺序 - 一棵树
答案为点数, 因为每个点都可以作为根表示不被使用 - 其他情况
显然无解
总结一下这个问题
首先注意到如果两个间隔涉及到了同样的辅助点, 那么这两个间隔之间存在约束
考虑处理这个约束
用一条边表示一个间隔, 以此进行选点的操作
这个题确实太偏思维了
考虑处理约束, 但是发现这个约束具有传递性
套路的尝试用图论刻画传递性
通过简单模拟不难发现, 传递性来自选择一个跳板之后, 其他可能选择这个跳板的间隔就只能放弃它
不难先处理出所有会被确定的跳板, 然后处理剩下的间隔
注意到剩下的间隔形成的约束关系大致是这样的
\(\alpha\) 间隔确定了跳板, 然后 \(\beta\) 间隔因为不能用这个跳板, 只能选择另一个跳板
如此下去
考虑就这样建边
对每个间隔建两个点, 分别表示选择这个间隔的 \(0\) 跳板和 \(1\) 跳板, 然后对相同跳板的间隔的另外一个跳板连边, 表示选了一个跳板之后, 剩下的间隔就只能选择另一个跳板, 如果超过一个间隔需要使用这个跳板, 那么就无解
如果同一个位置在一个连通块中出现了超过一次, 那么无解
发现这样能判无解, 但是搞不了方案数
考虑怎样处理方案数
注意到这个题过于神秘
只能用下面的方法解释
考虑一种合法解
如果你要调整到另一个跳板, 就会把原来的点挤出去, 对这个建图
如果图是一棵树, 我们以没有被占用的点为根, 那么可以任意找一个根链然后跳上去, 因此方案数为点数
如果图是基环树, 那么可以找那个环, 然后绕着环跳, 方案数为 \(2\)
如果图是一个自环, 没得跳, 方案数为 \(1\)
总结
约束具有传递性的问题, 考虑用图论刻画
一类类似挤压的问题, 考虑对挤压建边???

浙公网安备 33010602011771号