解法一:树状数组

参考:https://blog.csdn.net/liuchuo/article/details/52231409

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int MAX_N = 100005;
  4. // 树状数组c对应的原数组a[i]表示i出现的频率
  5. int c[MAX_N];
  6. deque<int> s;
  7. int lowbit(int x) {
  8. return x & (-x);
  9. }
  10. // 在i的位置上加上k
  11. void update(int i, int k) {
  12. while (i < MAX_N) {
  13. c[i] += k;
  14. i += lowbit(i);
  15. }
  16. }
  17. // 原数组a[1]到a[i]的和
  18. int getsum(int i) {
  19. int res = 0;
  20. while (i > 0) {
  21. res += c[i];
  22. i -= lowbit(i);
  23. }
  24. return res;
  25. }
  26. int peek() {
  27. int left = 1;
  28. int right = MAX_N;
  29. int target = (s.size() + 1) / 2;
  30. int mid;
  31. while (left < right) {
  32. mid = (left + right) / 2;
  33. if (getsum(mid) < target) {
  34. left = mid + 1;
  35. } else {
  36. right = mid;
  37. }
  38. }
  39. return left;
  40. }
  41. int main() {
  42. ios::sync_with_stdio(false);
  43. cin.tie(0);
  44. int N;
  45. cin >> N;
  46. int num;
  47. string op;
  48. for (int i = 0; i < N; ++i) {
  49. cin >> op;
  50. switch (op[1]) {
  51. case 'o':
  52. if (s.empty()) {
  53. cout << "Invalid\n";
  54. } else {
  55. cout << s.back() << "\n";
  56. update(s.back(), -1);
  57. s.pop_back();
  58. }
  59. break;
  60. case 'u':
  61. cin >> num;
  62. update(num, 1);
  63. s.push_back(num);
  64. break;
  65. default:
  66. if (s.empty()) {
  67. cout << "Invalid\n";
  68. } else {
  69. cout << peek() << "\n";
  70. }
  71. }
  72. }
  73. }