本文主要是介绍NEUOJ 1117: Ready to declare(单调队列),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1117: Ready to declare
时间限制: 1 Sec 内存限制: 128 MB提交: 358 解决: 41
[ 提交][ 状态][ 讨论版]
题目描述
输入
输出
Each case output two lines.The first line is each meet's min handsome value, the second line is each meet's max handsome value.
样例输入
8 3
5 3 2 1 1 10 2 3
样例输出
2 1 1 1 1 2
5 3 2 10 10 10
提示
来源
2011.12
虽然正解是单调队列,可是我用的是两个栈实现的队列水过的,存下代码
/*************************************************************************> File Name: Euler.cpp> Author: acvcla> QQ: > Mail: acvcla@gmail.com > Created Time: 2014年10月30日 星期四 11时19分11秒************************************************************************/
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn=1e5+5;
int stack1[maxn],stack2[maxn],max2[maxn],max1,min2[maxn],min1;
int top1,top2;
void init(){top1=top2=0;max1=max2[top2]=0;min1=min2[top2]=maxn;
}
int ans1[maxn],ans2[maxn];
void deque(){if(top2>0){stack2[--top2];return ;}while(top1>0){stack2[top2]=stack1[--top1];max2[top2]=max(top2>0?max2[top2-1]:0,stack2[top2]);min2[top2]=min(top2>0?min2[top2-1]:maxn,stack2[top2]);top2++;}max1=0;min1=maxn;--top2;
}
int get_max_min(int x){if(x)return max(max1,top2>0?max2[top2-1]:0);return min(min1,top2>0?min2[top2-1]:maxn);
}
void push(int x){max1=max(x,max1);min1=min(x,min1);stack1[top1++]=x;
}
int main()
{int n,k,x;while(~scanf("%d%d",&n,&k)){init();int t=0,cnt=0;for(int i=1;i<=n;i++){scanf("%d",&x);push(x);++cnt;if(cnt==k){ans1[t]=get_max_min(0);//cout<<"sldl"<<endl;ans2[t++]=get_max_min(1);deque();cnt--;}}for(int i=0;i<t;i++)printf("%d%c",ans1[i],i==t-1?'\n':' ');for(int i=0;i<t;i++)printf("%d%c",ans2[i],i==t-1?'\n':' ');}return 0;
}
补上单调队列版
#include <cstdio>
#include <iostream>
using namespace std;
const int maxn =1e5 + 10;
struct Queue
{int value;int index;
};
Queue min_que[maxn],max_que[maxn];
int n,k,num[maxn],front,rear;
int delete_rear_inc(int f,int r,int d)
{int mid;while(f<=r){mid=(f+r)/2;if(min_que[mid].value==d) return mid;if(min_que[mid].value>d) r=mid-1;else f=mid+1;}return f;
}
int delete_rear_dec(int f,int r,int d)
{int mid;while(f<=r){mid=(f+r)/2;if(max_que[mid].value==d) return mid;if(max_que[mid].value>d) f=mid+1;else r=mid-1;}return f;
}
int main()
{while(~scanf("%d%d",&n,&k)){for(int i=1;i<=n;i++)scanf("%d",&num[i]);min_que[1].value=num[1];front=rear=min_que[1].index=1;for(int i=2;i<=k;i++) {rear=delete_rear_inc(front,rear,num[i]);min_que[rear].value=num[i];min_que[rear].index=i;}printf("%d",min_que[1].value);for(int i=k+1;i<=n;i++) {rear=delete_rear_inc(front,rear,num[i]);min_que[rear].value=num[i];min_que[rear].index=i;if(i-min_que[front].index>=k) front++;printf(" %d",min_que[front].value);if(i==n)puts("");}max_que[1].value=num[1];front=rear=max_que[1].index=1;for(int i=2;i<=k;i++) {rear=delete_rear_dec(front,rear,num[i]);max_que[rear].value=num[i];max_que[rear].index=i;}printf("%d",max_que[1].value);for(int i=k+1;i<=n;i++) {rear=delete_rear_dec(front,rear,num[i]);max_que[rear].value=num[i];max_que[rear].index=i;if(i-max_que[front].index>=k) front++;printf(" %d",max_que[front].value);if(i==n)puts("");}}return 0;
}
这篇关于NEUOJ 1117: Ready to declare(单调队列)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!