其他分享
首页 > 其他分享> > CF1495E Qingshan and Daniel(链表,bfs)

CF1495E Qingshan and Daniel(链表,bfs)

作者:互联网

CF1495E Qingshan and Daniel

\(n\) 堆牌形成一个环每堆是红牌或蓝牌。从 \(1\) 号堆出第一张牌。以后每张牌出之前这种牌顺时针最近的且不同色的牌。求最后每堆牌出了几张。

CODE 正解

CODE 链表

首先把第 \(1\) 堆出了,以后每次出牌必然是一段同色段的第一张。

不分析性质的暴力模拟(链表做法):把所有同色段合到同色段里第一堆,用第一堆的内嵌链表存储。每次找到全局最小牌堆 \(x\),全局减 \(x\),同色段合并,也用链表(链表套链表)。

有个细节就是由于 \(1\) 出了所以每次优先出牌权在与 \(1\) 不同色的堆中。最后如果不同色的堆有剩余,把 \(1\) 顺时针最近的一堆减 \(1\)。

优化到 \(\Theta(n)\):每次找一个 \(\le\) 左右牌堆的牌堆(找的过程可以用 bfs 取队列顶),然后把它清空并且把右边的牌堆减去它的牌数(顺着链表减,一个原来的堆减没了就从链表中删除下一堆),然后把它左右合并。

正解做法:设颜色为 RB,且 R 的牌数 \(\le\) B。最后 R 肯定全出完了。最后出牌序列是 BRB...RBRBRBRB...RBRB,取决于 \(1\) 的颜色。于是如果是 BRB...RBRB,就先让 \(1\) 出牌,然后把牌权给下家。然后现在就相当于所有 R 出牌会让下家 B 出牌。执行顺序就不重要了。于是直接跑(最多两圈),遇到 R 出空拿手上,遇到 B 把手上牌拿出来消掉对掉即可。

最后压缩输出的时候爆 long long,我流汗黄豆。

标签:牌堆,...,每堆,Qingshan,RBRB,链表,同色,CF1495E
来源: https://www.cnblogs.com/Pizza1123/p/16688803.html