众所周知,山山是一名优秀的王者荣耀选手,他能有今天的成就不仅在于刻苦的训练,还在于他有一套独特的训练计划。
比如,山山在开始接触游戏的时候,就邀请好朋友乐乐帮他开发了一套辅助复盘的训练工具,用来在每次比赛之后对比赛进行复盘。该训练工具有以下几种功能:
用图的结构来记录出所有的打野路线。
输入指令0,代表选择模拟路线。山山可以再输入一个整数p,代表从当前节点选择第p条路线前往下一个节点。
输入指令1,代表存档。山山可以再输入一个整数q,代表选择将当前所在的节点位置存储进第q个存档点(本工具共有100个存档点),如果该位置已有存档,则覆盖之前的存档。
输入指令2,代表读取存档r。山山可以再输入一个整数,代表读取第r个存档点中陆陆所在的位置,如果该位置没有存档,则不做任何操作。
现在,山山想将自己的工具分享给你使用,并把她曾经的复盘记录指令交给你,聪明的你能否顺利完成山山的比赛复盘全过程,并将每一条指令下达后山山所在的节点位置正确输出呢?
输入格式:
第一行三个正整数,n, m, now, 表示共有n个节点,m个指令,初始位置为now
接下来n行,每行第一个数字为ki,后面为ki个整数,表示第i个节点的所有路线
接下来m行,每行两个数字op, pos,分别表述指令的种类和指令的值(p, q, r)
n <= 1e5, m <= 1e6, 所有ki的和小于1e6
输出格式:
对于每个指令,输出指令执行后山山的位置
限制:
空间限制:128MByte
时间限制:1秒
样例:
输入:
4 5 1
2 2 3
1 4
1 4
1 1
0 1
0 1
1 1
0 1
2 1
输出:
2
4
4
1
4
你个……
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
const int N = 1e5+100;
vector<int> rode[N];
int save[N];
int main()
{
int n , m , now;
scanf("%d%d%d",&n,&m,&now);
int numn;
for(int i=1;i<=n;i++)
{
scanf("%d",&numn);
for(int j=1;j<=numn;j++)
{
int a;
scanf("%d",&a);
rode[i].push_back(a);
}
}
int num,to;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&num,&to);//以上就是一个输入
if(num == 0)//判断num的值是否为0
{
now = rode[now][to-1];//下一个节点
printf("%d\n",now);//输出该指令下达后山山所在的节点位置
}
else if(num == 1)//是否为1
{
save[to] = now;//存档,覆盖或不覆盖
printf("%d\n",now);//输出该指令下达后山山所在的节点位置
}
else if(num == 2)//是否为2
{
if(save[to])
now = save[to];//读取第r个存档点中陆陆所在的位置,如果该位置没有存档,则不做任何操作
printf("%d\n",now);//输出该指令下达后山山所在的节点位置
}
}
return 0;
}