牛客小白月賽8 vector的使用
阿新 • • 發佈:2018-12-22
連結:https://www.nowcoder.com/acm/contest/214/F
來源:牛客網
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
這道題就是充分使用lower_bound()函式和upper_bound()函式。迭代器的使用也很重要。
程式碼如下:
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> #include<vector> #include<set> #include<map> #include<queue> #define pi acos(-1) #define For(i, a, b) for(int (i) = (a); (i) <= (b); (i) ++) #define Bor(i, a, b) for(int (i) = (b); (i) >= (a); (i) --) #define max(a,b) (((a)>(b))?(a):(b)) #define min(a,b) (((a)<(b))?(a):(b)) #define lson l, mid, rt << 1 #define rson mid + 1, r, rt << 1 | 1 #define eps 1e-7 using namespace std; typedef long long ll; const int maxn = 100 + 10; const int INF = 0x3f3f3f3f; const double EPS = 1e-10; const ll mod = 1e9 + 7; inline int read(){ int ret=0,f=0;char ch=getchar(); while(ch>'9'||ch<'0') f^=ch=='-',ch=getchar(); while(ch<='9'&&ch>='0') ret=ret*10+ch-'0',ch=getchar(); return f?-ret:ret; } int n; int main(){ scanf("%d",&n); vector <int> q; vector <int> :: iterator it; while(n--){ int num, x; scanf("%d%d",&num,&x); if(num == 1) q.insert(lower_bound(q.begin(), q.end(), x), x); else if(num == 2) q.erase(lower_bound(q.begin(), q.end(),x)); else if(num == 3) printf("%d\n",lower_bound(q.begin(),q.end(),x)-q.begin() +1); else if(num == 4) printf("%d\n",q[x-1]); else if(num == 5){ it = lower_bound(q.begin(),q.end(),x); printf("%d\n",*(--it)); } else if(num == 6){ it = upper_bound(q.begin(), q.end(),x); printf("%d\n",*it); } } return 0; }
繼續加油。