题目链接:点击打开链接
解题思路:
一个另类的方法就是当出现合并时,我们不需要去知道A合并B还是B合并A,当合并时只需要用原先来塞A和B一直合并的栈的set(因为等下删除比较容易,所以用set),因为有一点我们发现,如果被合并后的集合,如果下次在合并他会在最底下,除了被删除的一部分,所以需要用另一个模拟栈的数组去保存合并的集合,当合并后把A和B的集合都置为空,把合并的集合加到特殊保存的栈的就行了。
#include<bits/stdc++.h>
using namespace std;
const int mx = 1e5+10;
typedef long long ll;
int n,m;
struct element{
int num;
int time;
element(){}
element(int nu,int t):num(nu),time(t){}
bool operator < (element A)const
{
return time < A.time;
}
}stack1[mx],stack2[mx],merges[mx];
set <element> st;
int main()
{
char c[10],s[10],ch;
int x,top1,top2,cas = 1;
while(scanf("%d",&n)&&n){
top1 = top2 = 0;
st.clear();
int times = 0,mergelen = 0;
printf("Case #%d:\n",cas++);
while(n--){
scanf("%s%s",c,s);
if(c[1]=='u'){
scanf("%d",&x);
st.insert(element(x,times));
if(s[0]=='A') stack1[top1++] = element(x,times++);
else stack2[top2++] = element(x,times++);
//totlen++;
}else if(c[1]=='o'){
if(s[0]=='A'){
if(top1) printf("%d\n",stack1[--top1].num),st.erase(stack1[top1]);
else printf("%d\n",merges[--mergelen].num);
}
else{
if(top2) printf("%d\n",stack2[--top2].num),st.erase(stack2[top2]);
else printf("%d\n",merges[--mergelen].num);
}
}else{
scanf("%s",c);
for(auto it=st.begin();it!=st.end();it++)
{
merges[mergelen++] = *it;
//cout << it->num << endl;
}
top1 = top2 = 0;
st.clear();
}
}
}
return 0;
}