2016 Multi-University Training Contest 7 1010
思路:
我相信T的绝对是直接根据题目意思来了。
正确的一点小转变,比较一下那个队列小,然后把小的给大的,每次都这样就好了。
来想想,觉得这样好像也不对啊,我两个队列都push进去5e4,那么merge操作,还是1e4啊,但是说自己年轻就是连复杂度都不会计算,这个1e4只有一次啊...
年轻啊...七夕节快乐...
<pre name="code" class="cpp">#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> #include <queue> #include <stack> using namespace std; #define MAX 100010 #define ll long long #define mod 10000007 int n,m; struct node { int num; int pri; bool operator < (const node &a)const { return pri<a.pri; } }; priority_queue<node> P[3]; int main() { int i; int t=0; while(~scanf("%d",&n)&&n) { while(!P[0].empty()) P[0].pop(); while(!P[1].empty()) P[1].pop(); printf("Case #%d: ",++t); char s[11],x[2],y[2]; int a,b,bb; a=0; b=1; node now; for(i=0;i<n;i++) { scanf("%s",s); if(s[1]=='o') { scanf("%s",x); if(x[0]=='A') { bb=P[a].top().num; printf("%d ",bb); P[a].pop(); } else { bb=P[b].top().num; printf("%d ",bb); P[b].pop(); } } else if(s[1]=='u') { scanf("%s%d",x,&bb); now.num=bb; now.pri=i; if(x[0]=='A') P[a].push(now); else P[b].push(now); } else { scanf("%s%s",x,y); if(P[a].size()>P[b].size()) { while(!P[b].empty()) { P[a].push(P[b].top()); P[b].pop(); } if(x[0]!='A') { int temp; temp=a; a=b; b=temp; } } else { while(!P[a].empty()) { P[b].push(P[a].top()); P[a].pop(); } if(x[0]=='A') { int temp; temp=a; a=b; b=temp; } } } } } return 0; }