2026年5月18日讲题题单

A - 谜题 II

官方题解

https://chat.deepseek.com/share/xrylflnahyz8ijyjns
首先我们按照小于好方向建边,\(A_{x1,y1}<A_{x2,y2}\) 那么就建边 \((x1,y1) \to (x2,y2)\)

那么,这个问题就是一个拓扑序计数,一个常见的想法是把边容斥掉。但是即便这样还是很难化简问题,我们会发现有些边没有办法容斥掉。

首先这个图的点数 \(2^k\) 十分特殊,我们假设这个图不是弱联通的,那么就存在不连通的两部分时独立的,在结合这两部分的时候,就需要乘上一个组合数 $2^k \choose x $,\(0 < x < 2^k\) 根据卢卡斯定理,这个式子在 mod 2 意义下总是 0。

接下来我们就发现我们就可以任意反向割边了,这样就可以转化图了,我们可以发现原图有环就会无解,否则我么可以把 DAG 全部转化为一棵内向树,因为树上的边都是割边。由于在 2 行的网格图中,最多度数为 3,其中一个是父亲,所以一个点最多有两个儿子。那么这个树的拓扑序方案数为奇数,当且仅当每一个为有两个孩子的节点,他的两个子树的大小的二进制位没有交。

还有一个容易忽略的转化,就是我们每次把图上横边定向为向右,其实是想在做网格dp的时候顺便进行最后内向树的树形dp,更好的利用本道题目的性质来优化。

还有一个dp trick就是把我们的条件放到枚举里面,这题就是把枚举所有可能的前驱,变成枚举子集降低了复杂度。

这样进行一些推式子之后还是没有办法做到正确的复杂度,但是我们敏锐地发现数据组数位 32,而且输入的时候也是用 unsigned 把这 32 组数据压在一个整形内的,32 刚好是 unsigned 类型的大小,于是我们考虑把 T 组数据一起处理,我们惊讶地发现无论 dp,a,b,c 这些数组如何,都不会影响我们都有固定的转移路径(只不过有些边不能转移),于是我们整体转移就可以消除一个 32 的常数,就可以通过了。

posted @ 2026-05-19 17:25  suuugg  阅读(22)  评论(0)    收藏  举报