题目链接:https://vjudge.net/problem/ZOJ-4016
题意:n个栈 q次操作 ,op=1 向s栈压入v,op=2 弹出s栈的栈顶,op=3 将v栈接在s栈后。
一开始就感觉出来不能用栈模拟,所以用了vector模拟,结果又是超内存又是超时
用list模拟就好了
list用法讲解:https://blog.csdn.net/yas12345678/article/details/52601578
#include<cstdio>
#include<vector>
#include <list>
#include <iostream>
#include <algorithm>
using namespace std;
const int N=3e5+5;
list <int> a[N];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n,q;
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
a[i].clear();
while(q--){
int op,s,t;
scanf("%d",&op);
if(op==1){
scanf("%d%d",&s,&t);
a[s].push_back(t);
}
else if(op==2){
scanf("%d",&s);
if(a[s].empty()){
printf("EMPTY\n");
}
else{
printf("%d\n",a[s].back());
a[s].pop_back();
}
}
else if(op==3){
scanf("%d%d",&s,&t);
if(a[t].size()==0)continue;
a[s].splice(a[s].end(),a[t]);
}
}
}
return 0;
}