牛客小白月賽8 數列操作
阿新 • • 發佈:2019-02-14
題目描述
clccle是個蒟蒻,她經常會在學校機房裡刷題,也會被同校的dalao們虐,有一次,她想出了一個毒瘤資料結構,便興沖沖的把題面打了出來,她覺得自己能5s內切掉就很棒了,結果evildoer過來一看,說:"這思博題不是1s就能切掉嘛",clccle覺得自己的信心得到了打擊,你能幫她在1s中切掉這道水題嘛?
你需要寫一個毒瘤(劃掉)簡單的資料結構,滿足以下操作
1.插入一個數x(insert)
2.刪除一個數x(delete)(如果有多個相同的數,則只刪除一個)
3.查詢一個數x的排名(若有多個相同的數,就輸出最小的排名)
4.查詢排名為x的數
5.求一個數x的前驅
6.求一個數x的後繼
輸入描述:
第一行,輸入一個整數n,表示接下來需要輸入n行 接下來n行,輸入 一個整數num和一個整數x
輸出描述:
當num為3,4,5,6時,輸出對應的答案
示例1
輸入
8 1 10 1 20 1 30 3 20 4 2 2 10 5 25 6 -1
輸出
2 20 20 20
程式碼:
#include<bits/stdc++.h> using namespace std; const int MAXN = (int)1e5 + 5; int n, num, x; vector<int> a; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> n; for (int i = 1; i <= n; ++i) { cin >> num >> x; switch (num) { case 1: a.insert(lower_bound(a.begin(), a.end(), x), x); break; case 2: a.erase(lower_bound(a.begin(), a.end(), x)); break; case 3: cout << lower_bound(a.begin(), a.end(), x) - a.begin() + 1 << endl; break; case 4: cout << *(a.begin() + x - 1) << endl; break; case 5: cout << *(lower_bound(a.begin(), a.end(), x) - 1) << endl; break; case 6: cout << *upper_bound(a.begin(), a.end(), x) << endl; break; } } }