1. 程式人生 > >牛客小白月賽8 數列操作

牛客小白月賽8 數列操作

題目描述

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;
        }
    }
}