CF1495E Qingshan and Daniel(链表,bfs)
作者:互联网
\(n\) 堆牌形成一个环每堆是红牌或蓝牌。从 \(1\) 号堆出第一张牌。以后每张牌出之前这种牌顺时针最近的且不同色的牌。求最后每堆牌出了几张。
首先把第 \(1\) 堆出了,以后每次出牌必然是一段同色段的第一张。
不分析性质的暴力模拟(链表做法):把所有同色段合到同色段里第一堆,用第一堆的内嵌链表存储。每次找到全局最小牌堆 \(x\),全局减 \(x\),同色段合并,也用链表(链表套链表)。
有个细节就是由于 \(1\) 出了所以每次优先出牌权在与 \(1\) 不同色的堆中。最后如果不同色的堆有剩余,把 \(1\) 顺时针最近的一堆减 \(1\)。
优化到 \(\Theta(n)\):每次找一个 \(\le\) 左右牌堆的牌堆(找的过程可以用 bfs 取队列顶),然后把它清空并且把右边的牌堆减去它的牌数(顺着链表减,一个原来的堆减没了就从链表中删除下一堆),然后把它左右合并。
正解做法:设颜色为 R
和 B
,且 R
的牌数 \(\le\) B
。最后 R
肯定全出完了。最后出牌序列是 BRB...RBRB
或 RBRB...RBRB
,取决于 \(1\) 的颜色。于是如果是 BRB...RBRB
,就先让 \(1\) 出牌,然后把牌权给下家。然后现在就相当于所有 R
出牌会让下家 B
出牌。执行顺序就不重要了。于是直接跑(最多两圈),遇到 R
出空拿手上,遇到 B
把手上牌拿出来消掉对掉即可。
最后压缩输出的时候爆 long long
,我流汗黄豆。
标签:牌堆,...,每堆,Qingshan,RBRB,链表,同色,CF1495E 来源: https://www.cnblogs.com/Pizza1123/p/16688803.html