L3-002 特殊堆疊(天梯賽)
阿新 • • 發佈:2022-04-20
開始我想的是用multiset 和stack維護 但是發現 雖然multiset插入很方便 但是不能查詢中值
這樣就可以拿到17分了
查詢中值最快的方法一定是陣列下標 假如我們用陣列代替multiset的話 唯一不方便的就是要讓每次插入後序列都有序
每次排序肯定不行 考慮lower_bound操作 這樣就能滿足了 這個題目給我們的經驗就是 陣列加lowbound比multiset更優
// Murabito-B 21/04/23 #include <bits/stdc++.h> using namespace std; using ll = long long; void solve() { int n, x; string s; cin >> n; vector<int> v, v1; while (n--) { cin >> s; if (s == "Push") { cin >> x; v1.push_back(x); auto it = lower_bound(v.begin(), v.end(), x); v.insert(it, x); } else if (s == "Pop") { if (v1.size() == 0) cout << "Invalid\n"; else { auto it = lower_bound(v.begin(), v.end(), v1[v1.size() - 1]); v.erase(it); cout << v1[v1.size() - 1] << "\n"; v1.pop_back(); } } else { if (v1.size() == 0) cout << "Invalid\n"; else { if (v.size() & 1) cout << v[v.size() / 2] << '\n'; else cout << v[v.size() / 2 - 1] << "\n"; } } } } int main() { ios_base::sync_with_stdio(false), cin.tie(0); solve(); return 0; }