P3095 [USACO13DEC]The Bessie Shuffle S 题解
HyB_Capricornus · · 题解
本蒟蒻居然 AC 了紫题
本蒟蒻就把自己的思考过程写一下:
首先,本人想到了如果题面改为如下:
有
对于这个问题,我们可以很容易想到倍增。
倍增预处理
我们定义
套倍增
但是如果换为题面,我们需要在每次交换时取出第一个,这个无法预处理,我们就无法用二进制拆分
但是我们怎么把原始序列往里套呢?
下面给出我的方法,强烈建议先自行思考再阅读本文。
若还需要倍增,就需要通过长度为 用时3天想到将已经取出的元素放置序列末尾。
我们可以如此构造
-
对于
i \in [1,m] ,q_i=p_i-1 ,其中p_i=1 的移到队尾:n 。 -
对于
i \in [m+1,n] ,我们仅需向前挪,及p_i=i-1 。
代码
本人给出本人被卡的地方,警示后人 (给个赞呗)。
-
请注意本题是一个牌堆,相当于一个栈,所以牌堆最后的顺序是反着的。
-
建议先将临时牌堆的数据存储下来,再
O(1) 输出。(本人不知为何 WA) -
注意题目中不足
m 张时要依次放到牌堆上。(本人被卡无数次)