题意简述
给一个 $n$ 个点 $m$ 条边的 DAG,你可以进行至多 $4242$ 次修改操作,每次删掉一条边或加上一条边(修改之后允许有环、重边、自环)。
在这个图上定义函数 $f(S)$ ,表示如果在多重集合 $S$ 的每一个元素上放一个球,两人轮流操作,每次把一个球向某一条出边移动,不能操作者输,那么是先手是胜还是输,或者永远玩不完(平)。
(双方的策略均为先尽量赢,再尽量平。)
接下来 $T$ 组数据,每组数据中交互器确定一个特殊点 $x$ ,你要通过询问来找到这个特殊点。
一次询问可以问大小不超过 $20$ 的多重集合 $S$ ,返回 $f(S+{x})$ 的值。最多问 $20$ 次,集合大小的总和不能超过 $20$ 。
$n\le 1000,m\le 10^5,T\le 2000$
主要思路
假设图无环,则没有平局情况,故两点的SG
值必须两两不同,图这必须是一个完全 DAG。
那么,一个显然的想法是给除了那个完全 DAG 里的点都加上一个自环。
称 DAG 里的点是 A 类点,有自环的点是 B 类点。
不难发现,如果至少 2 个球在 B 类点上,一定是Draw
;有 1 个球在 B 类点上,不可能Lose
,因为其可以什么都不做。
于是现在考虑仅有 1 个球在 B 类点上的情况,考虑先手什么时候会将球移出去。
显然,先手不会将球移到另一个 B 类点上,因为此时不可能Win
。故先手仅可能将球移到一个 A 类点上。
不妨假设我们每次仅询问大小为 1 的集合,即,将 A 类点都询问一遍。
A 类点的SG
值都不相同,所以如果出现了Lose
,仅可能是询问点和答案相同。
否则,只会有一堆Win
和Draw
。类似地,Win
的情况为答案有连向询问点的出边。
所以只需保证每个 B 类点对 A 类边连边的集合不同即可。
于是钦定 A 类点不超过 $20$ 个,直接冲即可。
最后大概会修改 $3900$ 条边。
参考代码
1 |
|