小煜很快(题解)

导读:本篇文章讲解 小煜很快(题解),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

题目描述

小煜很快,“358团,谁不知道我是快枪手”,他经常这样说道。
他想和你玩个经典的游戏:将小球用几个杯子盖住然后随机交换位置,再让你猜球在哪个杯子里。当然因为小煜很快,他将不再使用3个杯子,而是使用n个杯子,小球也不止一个。他将进行m次交换。同时因为他很快,他能在一瞬间移动k个杯子。你尽力去跟上他的思必得,不过很可惜,你没能猜中小球的位置。不过没关系,你决定痛定思痛,总结经验,下次赢回来。
你现在知道了所有交换后的小球的位置,并向小煜问来了所有的交换情况。现在你想反推出一开始小球的位置。

输入

第一行有两个数字n和m,意思如题面描述。n和m不大于2000。
之后有m组数据,每组数据第一行是一个数字k,意思如题面描述。k不大于100。之后的k行每行包括两个数字a和b,用空格隔开,表示将a杯子移动到b杯子的位置。
举个例子:
    5
    1 2
    2 3
    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

AC代码

#include<iostream>
#include<queue>
using namespace std;
const int N = 2002;
const int K = 101;

queue <int> 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<<q[f].front()<<endl;
    }
}

 

注意

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

利用队列完美地模拟了该问题地换数需求。

让每一个位置成为一个队列,方便如题一样的输入形式。

 

 

 

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/103329.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!