[USACO13DEC] The Bessie Shuffle S

10 篇文章 0 订阅

[USACO13DEC] The Bessie Shuffle S


[P3095 USACO13DEC] The Bessie Shuffle S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

Bessie is practicing her card tricks. She has already mastered the Bessie- shuffle – a shuffle on M (2 <= M <= 100,000) cards that reorganizes the cards so the i-th card from the top is now the P[i]-th card from the top.

Now Bessie is practicing shuffles on larger decks. She has a deck of N cards (M <= N <= 100,000) conveniently labeled 1 to N. She shuffles this deck by taking the first M cards and performing the Bessie-shuffle on them, placing the shuffled cards back on top of the deck. She then removes the top card from the deck and places it face down. She repeats this process, placing the top cards successively on top of each other, until she is out of cards. When Bessie has less than M cards left, she no longer performs the Bessie-shuffle, but continues to place the top card on top of the others.

Bessie knows that the deck initially started in sorted order, with 1 on top, 2 next, and N on the bottom. Given the description of the Bessie-shuffle, help Bessie compute which cards end up located at Q different specified positions (1 <= Q <= N, Q <= 5,000) in the deck.

贝西有一种独门的洗牌方法,称为贝西洗A:

贝西洗A:将一堆共M (2 <= M <= 100,000)张从上到下编号1…M的纸牌,从上到下第i张牌洗到位置p[i]。例M=3,P[1]=3,p[2]=1,p[3]=2,则执行一次洗法A后,从上到下将变为2,3,1,即牌1放到位置3,牌2放到位置1,牌3放到位置2。

贝西现在要练习另外一种更强的洗牌方法,称为贝西洗B,他有一堆N (M <= N <= 100,000)张编号为1…N的牌,并按从上到下1到N的顺序堆放。另有一个堆用来辅助洗牌,称为临时堆,开始时为空。

贝西洗B:(1)将最上面M张牌进行贝西洗A,(2)将最上面的一张牌放到临时堆的最上方;重复(1)(2)操作,直到原先的堆没有牌为止。

以上过程中,当原先堆的牌不足M张的时候,将不进行贝西洗A,而是将最上面的牌依次放到临时堆上。

现在有Q个询问,求临时堆中Qi位置上的牌的编号。

输入格式

* Line 1: A single line containing N, M and Q separated by a space.

* Lines 2…1+M: Line i+1 indicates the position from the top, P[i], of the i-th card in the Bessie-shuffle (1 <= P[i] <= M).

* Lines 2+M…1+M+Q: Line i+1+M contains a single integer q_i

describing the i-th query. You are to compute the label on the card located in position q_i from the top (1 <= q_i <= N).

输出格式

* Lines 1…Q: On the i-th line, print a single integer indicating the card at position q_i from the top.

样例 #1

样例输入 #1

5 3 5 
3 
1 
2 
1 
2 
3 
4 
5

样例输出 #1

4 
5 
3 
1 
2

提示

Bessie has a deck of 5 cards initially ordered as [1, 2, 3, 4, 5]. Her shuffle is on 3 cards and has the effect of moving the top card to the bottom. There are 5 queries querying each position in the deck.

The shuffle proceeds as:

[1, 2, 3, 4, 5] -> [2, 3, 1, 4, 5] (put 2 face down) 
[3, 1, 4, 5] -> [1, 4, 3, 5] (put 1 face down) 
[4, 3, 5] -> [3, 5, 4] (put 3 face down) 
[5, 4] (put 5 face down) 
[4] (put 4 face down) 

This produces the final order of [4, 5, 3, 1, 2]

思路

从后往前模拟第 x x x 张牌每一轮之前的位置。

code

#include <bits/stdc++.h>
#define fu(x , y , z) for(int x = y ; x <= z ; x ++)
using namespace std;
int n , m , rep[100005];
int main () {
    int T , a , ans;
    scanf ("%d%d%d" , &n , &m , &T);
    fu (i , 1 , m) {
        scanf ("%d" , &a);
        rep[a] = i;
    }
    while (T --) {
        scanf ("%d" , &a);
        ans = n - a + 1;
        for (int i = n - a + 1 ; i >= 1 ; i --) 
            if (ans <= i + m - 1 && i + m - 1 <= n) 
                ans = i + rep[ans - i + 1] - 1;
        printf ("%d\n" , ans);
    }
    return 0;
}
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值