话不多说,直接看题:
前4个操作我们可以用deque解决,第5个我们不用真的去反转,调换一下头尾即可。
下面是AC代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,k,k1,ee=0;
bool cm1(int a,int b){
return a<b;
}
bool cm2(int a,int b){
return a>b;
}
int main(){
cin>>n>>m;
deque<int> q;
deque<int> qq;
for(int i=0;i<m;i++){
cin>>k;
if(k==1){
if(ee==0){
cin>>k1;
q.push_front(k1);}
else{
cin>>k1;
q.push_back(k1);
}
}
if(k==2&&ee==0) q.pop_front();
if(k==2&&ee==1) q.pop_back();
if(k==3){
if(ee==0){
cin>>k1;
q.push_back(k1);}
else{
cin>>k1;
q.push_front(k1);
}
}
if(k==4&&ee==0) q.pop_back();
if(k==4&&ee==1) q.pop_front();
if(k==5) ee=1-ee;
if(k==6){
cout<<q.size()<<endl;
int y=q.size();
if(ee==0){for(int i=1;i<=y;i++){
qq.push_back(q.front());
cout<<q.front()<<" ";
q.pop_front();
}
}
else{
for(int i=0;i<y;i++){
qq.push_front(q.back());
cout<<q.back()<<" ";
q.pop_back();}
}
cout<<endl;
int u=qq.size();
for(int i=0;i<u;i++){
q.push_front(qq.back());
qq.pop_back();}
qq.clear();
}
if(k==7){
if(ee==0) sort(q.begin(),q.end(),cm1);
else sort(q.begin(),q.end(),cm2);
}
}
}
接题:
首先,我们很容易想到用两个指针形成k的区间然后不断维护max/min,但事实上,我们还需要维护次小值,相对比较麻烦。
于是,我们可以按下图有机会为最值存入双端队列的方式进行:
下面为AC代码(非空判断一定写与的前面!!!!!):
#include<bits/stdc++.h>
using namespace std;
int n,k;
struct node{
int zhi,biao;
}a[1000010];
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++){
scanf("%d",&a[i].zhi);
a[i].biao=i;
}
deque<node> q;
deque<node> q1;
int i=1,cnt=0,i1=1,cnt1=0;
while(cnt1<n){
while(!q1.empty()&&(a[i1].zhi<=q1.back().zhi)){
q1.pop_back();
}
q1.push_back(a[i1]);
cnt1++;
i1++;
if((q1.front().biao==cnt1-k)) q1.pop_front();
if(cnt1-k>=0) cout<<q1.front().zhi<<" ";
}
cout<<endl;
while(cnt<n){
while(!q.empty()&&(a[i].zhi>q.back().zhi)){
q.pop_back();
}
q.push_back(a[i]);
cnt++;
i++;
if((q.front().biao==cnt-k)) q.pop_front();
if(cnt-k>=0) cout<<q.front().zhi<<" ";
}
}
让我们再来一个用这种单调队列思想的题把:
这题和上一题差不多,从右向左即可,下面是AC代码:
#include<bits/stdc++.h>
using namespace std;
int n;
struct node{
int tall,index;
}a[100010];
int b[100010];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].tall;
a[i].index=i;
}
deque<node> q;
for(int i=n;i>=1;i--){
while(!q.empty()&&a[i].tall>=q.front().tall){
q.pop_front();
}
if(q.empty()) b[i]=0;
else b[a[i].index]=q.front().index;
q.push_front(a[i]);
}
for(int i=1;i<=n;i++) cout<<b[i]<<endl;
}