题解:
题目说起来是栈的样子,然而是模拟链表的做法,这道题可以用STL的list(这个是我在比赛之后学的。。蛋疼,手撸又撸不出来),也可以像我朋友一样C语言手撸出来个链表:https://www.cnblogs.com/jaydenouyang/p/8747352.html
ORZ。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<list>
using namespace std;
const int MAXN=3e5+7;
list<int>l[MAXN];
int main()
{
int n,q,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
l[i].clear();
for(int i=1;i<=q;i++)
{
int op,s,t,v;
scanf("%d",&op);
if(op==1)
{
scanf("%d%d",&s,&v);
l[s].push_back(v);
}
else if(op==2)
{
scanf("%d",&s);
if(l[s].empty()){
printf("EMPTY\n");
continue;
}
printf("%d\n",l[s].back());
l[s].pop_back();
}
else
{
scanf("%d%d",&s,&t);
l[s].splice(l[s].end(),l[t]);//这里不能用merge(),因为merge是要求两个链表有序的,而splice的合并是直接合并的,复杂度是线性的。
}
}
}
}