输入样例:
10 11
3 2 3 4
1 6
3 4 7 5
1 3
1 9
2 3 5
3 1 8 5
1 9
2 8 10
0
1 1
0 3
0 1
1 2
0 2
0 2
2 2
0 3
0 1
1 1
0 2
输出样例:
1
3
9
10
样例解释:
简单给出样例中经过的剧情点顺序:
1 -> 4 -> 3 -> 7 -> 8 -> 3 -> 5 -> 9 -> 10。
档位 1 开始存的是 1 号剧情点;档位 2 存的是 3 号剧情点;档位 1 后来又存了 9 号剧情点。
---------------------------------------------------------------------------------------------------------------------------------
一些知识点:
1.定义一个数组,数组元素为vector<int>v;
struct vec{
vector<int>v;
}a[100005];
2.向 a 中的 v 添加元素
a[i].v.push_back(num);
3.得到 a 中 v 的第 y 个元素
id=a[id].v[y];
4.遍历vector;
for(int j:ans)
printf("%d\n",j);
题目要注意:
进行存档后,不会跳到原点,而是就在当前点!
俺的代码:
#include<iostream>
#include<map>
#include<vector>
using namespace std;
int n,m,id=1; //id当前位置
map<int,int>d; //存档
vector<int>ans; //存档记录
struct vec{
vector<int>v;
}a[100005];
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
int k;
scanf("%d",&k);
for(int j=0;j<k;j++){
int num;
scanf("%d",&num);
a[i].v.push_back(num);
}
}
for(int i=1;i<=m;i++){
int x,y; scanf("%d%d",&x,&y);
if(x==1){
d[y]=id;
ans.push_back(id);
}
else if(x==0){
y--;
id=a[id].v[y];
}
else{
id=d[y];
}
}
for(int j:ans)
printf("%d\n",j);
printf("%d",id);
return 0;
}
可以用来复习vector的一些操作。