喵了个喵 题解
这玩意是 T2 ???
观察到 \(k=2n-2\) 或 \(k=2n-1\),所以我们可以尝试让每个栈里面都保持两张牌。同时保留一个空栈,用来消栈底。 记这个保留的空栈为 \(sp\)。
策略 1:
-
如果当前牌堆顶的牌能消,必然消;
-
否则除了 \(sp\),如果存在一个没有填到两张牌的栈,放进去。
当 \(k=2n-1\),可能策略1不适用:当前除了 \(sp\) 都填了 \(2\) 张牌,且牌堆顶的牌在当前所有栈中都没有出现。
我们找到当前牌堆中第一张出现在栈底的牌。 这张牌我们希望它放到 \(sp\) 号栈用操作二消除。但是当前牌堆顶可能要占用 \(sp\) 号栈,怎么办?
假设第一张出现在栈底的牌位置是 \(x\),\(x\) 对应的栈靠上的牌是 \(y\)。我们检查牌堆顶到 \(x\) 中间 \(y\) 出现了多少次:
-
如果是奇数次,说明可以把 \(y\) 消掉。那我们把牌堆顶放到 \(sp\) 号栈上。
因为 \(x\) 是第一张栈底牌,所以牌堆顶到 \(x\) 中间的牌都可以放到某个栈的栈顶消除。
于是我们把牌堆顶放到 \(sp\),把中间的牌放到栈顶消除,\(y\) 都放到 \(x\) 的栈上面,然后把 \(x\) 放到 \(x\) 的栈上——此时 \(y\) 已经消干净了。此时 \(x\) 所在的栈已经空了,我们把 \(sp\) 号栈改为这个栈即可。
-
如果是偶数次,把牌堆顶放到 \(x\) 所在栈上面(此时 \(y\) 被夹在中间),然后中间的除了 \(y\) 的牌都放到对应栈顶消除,\(y\) 都放到 \(sp\) 号栈消除(\(y\) 偶数次)。
然后把 \(x\) 放到 \(sp\) 号栈和 \(x\) 原来的栈底消除,此时 \(x\) 原来所在的栈就剩下原来牌堆顶和 \(y\) 了。依然满足每个栈只有 \(\le 2\) 张牌。