题目
官方答案:单调不递减队列 这样不用记cnt1 cnt2来维护 单调队列里面队头是否有效了。
class MaxQueue {
public:
queue<int>q1;
deque<int>q2;
MaxQueue() {
}
int max_value() {
if(q2.empty()) return -1;
return q2.front();
}
void push_back(int val) {
q1.push(val);
while(!q2.empty()&&q2.back()<val) q2.pop_back();
q2.push_back(val);
}
int pop_front() {
if(q1.empty()) return -1;
int ans=q1.front();q1.pop();
if(ans==q2.front()) q2.pop_front();
return ans;
}
};
我用的是单调递增队列,还要维护一下。。。
class MaxQueue {
struct node{
int id,val;
bool operator<=(const node&A)const{return val<=A.val;}
};
queue<int>q;
node qq[100005];
int head,tail,cnt1,cnt2;
public:
MaxQueue() {
this->head=1,this->tail=0;
this->cnt1=0,this->cnt2=0;
}
int max_value() {
while(head<=tail&&qq[head].id+cnt2<=0) ++head;
if(head>tail){
head-=tail,tail=0;
return -1;
}
return qq[head].val;
}
void push_back(int val) {
q.push(val),++cnt1;
node cur=(node){cnt1,val};
while(head<=tail&&qq[tail]<=cur) --tail;
qq[++tail]=cur;
}
int pop_front() {
if(q.empty()) return -1;
--cnt2;
int ans=q.front();q.pop();
return ans;
}
};