L3-002 特殊堆棧 (30 分) 模擬stl
阿新 • • 發佈:2019-03-29
tor col 特殊 gin lan begin 結構 如果 整數
堆棧是一種經典的後進先出的線性結構,相關的操作主要有“入棧”(在堆棧頂插入一個元素)和“出棧”(將棧頂元素返回並從堆棧中刪除)。本題要求你實現另一個附加的操作:“取中值”——即返回所有堆棧中元素鍵值的中值。給定 N 個元素,如果 N 是偶數,則中值定義為第 N/2 小元;若是奇數,則為第 (N+1)/2 小元。
輸入格式:
輸入的第一行是正整數 N(≤)。隨後 N 行,每行給出一句指令,為以下 3 種之一:
Push key
Pop
PeekMedian
其中 key
是不超過 1 的正整數;Push
表示“入棧”;Pop
表示“出棧”;PeekMedian
表示“取中值”。
輸出格式:
對每個 Push
操作,將 key
插入堆棧,無需輸出;對每個 Pop
或 PeekMedian
操作,在一行中輸出相應的返回值。若操作非法,則對應輸出 Invalid
。
輸入樣例:
17 Pop PeekMedian Push 3 PeekMedian Push 2 PeekMedian Push 1 PeekMedian Pop Pop Push 5 Push 4 PeekMedian Pop Pop Pop Pop
輸出樣例:
Invalid Invalid 3 2 2 1 2 4 4 5 3 Invalid
用兩個vector 一個維護棧 一個維護中值
char 比string真的快了很多很多!!!!! 如果遇到大規模的題用char快
還有個就是用lowbound 而不是用find的細節
要在vector裏lowbound 用叠代器來接收地址
erase(it) it也是叠代器
#include<bits/stdc++.h> using namespace std; //input #define rep(i,a,b) for(int i=(a);i<=(b);i++) #defineView CodeRI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s); #define LL long long #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define N 1020 int main() { vector<int>v; vector<int>v2; int n; RI(n); char str[20]; vector<int>::iterator it; while(n--) { RS(str);//這裏用char 比string類型的快了100ms 讀寫真的影響很大 if(str[1]==‘u‘) { int x; RI(x); v.push_back(x); it=lower_bound(v2.begin(),v2.end(),x); v2.insert(it,x); } else if(str[1]==‘o‘) { if(!v.size())printf("Invalid\n"); else { cout<< v[ v.size()-1 ]<<endl; it=lower_bound(v2.begin(),v2.end(),v[v.size()-1] );//這裏用lowbound比find 快很多 因為已經排序好了 v2.erase(it); v.pop_back(); } } else { if(!v.size())printf("Invalid\n"); else printf("%d\n",v2[ (v2.size()-1)/2]); } } return 0; }
L3-002 特殊堆棧 (30 分) 模擬stl