题目链接:点击打开链接
题目大意:略。
解题思路:multiset 技巧分为两个set,一个从小到大,一个从大到小,来控制平衡求第几大K数。
AC 代码
usingnamespacestd; typedeflonglongll; stack<int>sk; multiset<int>stmax; // 0->1multiset<int,greater<int>>stmin; // 1->0intmid; voidkeep() { intlen1=stmin.size(), len2=stmax.size(); if(len1<len2) // 1 2 { stmin.insert(*stmax.begin()); stmax.erase(stmax.begin()); } elseif(len1-len2>=2) // 2 2,5 3 { stmax.insert(*stmin.begin()); stmin.erase(stmin.begin()); } mid=*stmin.begin(); } intmain() { intn,val,id; charop[15]; scanf("%d",&n); for(inti=0;i<n;i++) { scanf("%s",op); if(op[1]=='u') { scanf("%d",&val); sk.push(val); if(val<=mid) stmin.insert(val); elsestmax.insert(val); keep(); } elseif(op[1]=='o') { if(sk.size()==0) puts("Invalid"); else { inttp=sk.top(); sk.pop(); printf("%d\n",tp); if(tp>*stmin.begin()) stmax.erase(stmax.find(tp)); elsestmin.erase(stmin.find(tp)); if(sk.size()!=0) keep(); } } elseif(op[1]=='e') { if(sk.size()==0) puts("Invalid"); elseprintf("%d\n",mid); } } return0; }