题意
- Marbles | Gym101908B
棋盘上有 n n n 个石头,第 i i i 个石头的初始位置为 ( x i , y i ) (x_i,y_i) (xi,yi)
双方轮流操作,每一次选择一个石头并移动它的位置
若这个石头一开始的位置为 ( l , r ) (l,r) (l,r),则它可以被移动到如下位置:
( l − u , r ) (l-u,r) (l−u,r)
( l , r − u ) (l,r-u) (l,r−u)
( l − u , r − u ) (l-u,r-u) (l−u,r−u)
前提是移动完之后横纵坐标都非负。 - 若有人把某个石头移动到
(
0
,
0
)
(0,0)
(0,0),他就赢了
问先手必胜情况 -
1
≤
n
≤
1000
1\le n\le 1000
1≤n≤1000
1 ≤ x i , y i ≤ 100 1\le x_i,y_i\le 100 1≤xi,yi≤100
思路
- 首先,每个石头相当于一个独立游戏。
更具体的,每个独立游戏相当于一个威佐夫博弈。
- 当然我们这里需要算出这个游戏的
S
G
SG
SG 的具体的值。
然后测试了一下,发现不大行。为什么呢?
因为一般的博弈是,操作不了的人输,即每个独立游戏都无法操作了,他就输了。
但这里,如果玩家对于某个独立游戏赢了,他就直接赢了。所以我们不能简单转移 S G SG SG。 - 考虑到,如果某个石头的坐标为
(
p
,
p
)
(p,p)
(p,p),那么先手直接把这个石头拿到
(
0
,
0
)
(0,0)
(0,0),不管其他石头怎么样,先手都是必胜的。这感觉和
S
G
SG
SG 的异或值就扯不上关系了,所以我们单独定义一个状态,我把它叫做
神圣态 - 我们看一下,哪些位置是是直接先手必胜的?
显然,为 ( p , p ) 、 ( 0 , p ) 、 ( p , 0 ) 、 ( 0 , 0 ) (p,p)、(0,p)、(p,0)、(0,0) (p,p)、(0,p)、(p,0)、(0,0) ,这些位置直接必胜,我们不考虑他们位置的 S G SG SG 值。
对于其他平凡位置 ( x , y ) (x,y) (x,y),它的 S G SG SG 即为:
S G ( x , y ) = M e x ( x , y ) 能转移到 ( p , q ) 且 ( p , q ) 不为神圣态 { S G ( p , q ) } SG(x,y)=\underset{(x,y)能转移到 (p,q)且(p,q)不为神圣态}{Mex}\{SG(p,q)\} SG(x,y)=(x,y)能转移到(p,q)且(p,q)不为神圣态Mex{SG(p,q)} - 若没有神圣态,那么根据所有石头的 S G SG SG 的异或值来判断先手是否必胜。
代码
- 时间复杂度:
O
(
N
+
10
0
2
)
O(N+100^2)
O(N+1002)