标题描述

肖宇射击很快,“在358团,大家都知道我射击很快。”他常说。

他要跟你玩一个经典的游戏:用几个杯子盖住一个球并随机交换它们的位置,然后让你猜猜球在哪个杯子里。当然,因为小宇速度很快,所以他不会用3个杯子三个杯子猜小球,而是n个杯子,而且球不止一个,他会进行m次交换。而且因为他的速度很快,所以他可以在一瞬间移动k个杯子。你拼尽全力跟上他的猜测,但很遗憾,你没能猜出球的位置。不过没关系,你决定从错误中汲取教训,总结经验,下次再赢。

现在你知道了所有球在交换后的位置,也向小宇询问了所有交换后的情况。现在你想推断球的初始位置。

进入

之一行两个数字n和m,含义与题目描述相同,n和m均不大于2000。

然后有m组数据,每组数据之一行是一个数字k,意思和题目描述的一样,k不大于100。接下来的k行每行包含两个数字a和b,中间用空格隔开,表示将杯子a移动到杯子b的位置。

例如:

1 2

23

3 1

4 5

5 4

经过这次移动后,杯子从一开始的 1 2 3 4 5 移动到了 3 1 2 5 4。

保证对于任意数字x,它要么不出现在这k行数据中,要么在左边出现一次,在右边出现一次。

后面是数字q,表示有q个球。

接下来是 q 行,每行一个数字 p 表示该单词被移动后的第 p 个杯子里有一个球。例如上例中 p 为 3,对应 3 1 2 5 4 中的 2,表示一开始 2 号杯子里有一个球。q 不大于 n,且每个 p 都不大于 n 且不相等。

输出

为每个输入p输出一个数字,每个数字占一行,表示每个输入p的起始位置。

示例输入

3 3
2
1 2
2 1
2
2 3
3 2
2
3 1
1 3
1
2

示例输出

3

交流代码

#include
#include
using namespace std;
const int N = 2002;
const int K = 101;
queue  q[N];
int main(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        q[i].push(i);
    }
    while(m--){
        int k;
        cin>>k;
        while(k--){
            int c,d;
            cin>>c>>d;
            q[d].push(q[c].front());
            q[c].pop();
        }
    }
    int l;
    cin>>l;
    int f;
    while(l--){
        cin>>f;
        cout<

注意

最精妙的部分是队列数组的创建和使用。

使用队列可以完美模拟该问题所需的交易数量。

让每个位置变成一个队列,以方便如标题所示的输入表单。

未经允许不得转载! 作者:admin,转载或复制请以超链接形式并注明出处天心神途传奇手游发布网

原文地址:《三个杯子猜小球 小雨快(解)》发布于:2024-06-24

发表评论

表情:
验证码
评论列表 (暂无评论,19人围观)

还没有评论,来说两句吧...