Time Limit: 1000 MS Memory Limit: 32768 KB Description 在阿哲的幻想国,每个人都可以把东西送给别人
给出每个人的物品,每个人都可以
x y, 代表x将将自己物品序列末尾的物品给y 如果x没有东西,什么都不会发生请你帮阿哲输出最终幻想国的人民的物品序列
Input 第一行一个n, 代表n个居民, 下面n行给出n个数字序列,第i个序列第一个数字k代表物品序列长度,接着是第i个居民的物品序列 然后一个q,接下来q行代表操作
1 <= n <= 100000, 1 <= q <= 100000, 物品总数保证不会超过100000, 且最初每个居民都拥有物品 Output 输出最终每个居民的物品序列 Sample Input 5 3 1 2 3 3 4 5 5 3 6 4 2 1 1 1 5 3 1 5 2 1 2 4 Sample Output 1 2 5 4 6 4 2 1 5 5 3
比较简单的模拟题,思路也比较清晰,由于在结构体中声明一个很大的数组会MLE,所以要用vector实现相应操作,还有一点要注意,如果一个人没有物品,应当输出回车,下面是ac代码:
#include<iostream> #include<vector> using namespace std; struct pero{ int k; //int things[80]; vector<int> things; //定义动态数组(向量) }; pero dat[100005]; int main() { int n,p,a,b; cin>>n; for(int i=1;i<=n;++i) { cin>>dat[i].k; for(int j=1;j<=dat[i].k;++j) { cin>>a; dat[i].things.push_back(a); //往向量里塞数据 } } cin>>p; for(int i=0;i<p;++i) { cin>>a>>b; if(dat[a].k!=0) //如果k为零则什么也不做 { //dat[b].things[++dat[b].k]=dat[a].things[dat[a].k--]; dat[b].things.push_back(dat[a].things[dat[a].k-1]); //把a的尾值给b,然后a的长度减一,b的长度加1 dat[a].things.pop_back(); //弹出a给b的值 dat[b].k++; dat[a].k--; } } for(int i=1;i<=n;++i) { if(dat[i].k==0) cout<<"\n"; //如果没有数据则输出回车 else for(int j=0;j<dat[i].k;++j) //顺序输出数据 { cout<<dat[i].things[j]; if(j==dat[i].k-1) cout<<"\n"; else cout<<" "; } } return 0; }