[POJ 2823] Sliding Window · 单调队列

来源:互联网 发布:淘宝上的伟哥药能买吗 编辑:程序博客网 时间:2024/06/13 23:02

单调队列。

会做BZOJ1047怎么可能连这种基础题都做不起来= =完全就是个裸的单调队列,不过队列里存的还是数组中对应值的下标,而不是值,方便做类似删除的操作。

附:单调队列基本不可能要写二分的,但是这题太逗比了。。。而且就算写了二分再加上读入输出优化也只有C的才能过,GCC过不了。。。难道是表示对不会C的C++党的鄙视吗?!

就当是练一下二分,顺便第一次写了输出优化(没想到还真有这种东西)

#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;const int N=1000005;int n,m,a[N],q[N],l,r,Min[N],Max[N];void ins1(int x){int s,e,mid;for (s=l,e=r;s+1!=e && s!=e;){mid=(s+e)>>1;if (a[q[mid]]<a[x]) s=mid;else e=mid;}if (a[q[s]]>a[x]) s--;r=s;q[++r]=x;}void ins2(int x){int s,e,mid;for (s=l,e=r;s+1!=e && s!=e;){mid=(s+e)>>1;if (a[q[mid]]>a[x]) s=mid;else e=mid;}if (a[q[s]]<a[x]) s--;r=s;q[++r]=x;}int get(){char x=getchar();int p=0,t=1;while (x<'0' || x>'9') {if (x=='-') t=-1;x=getchar();}while (x>='0' && x<='9') p=p*10+x-'0',x=getchar();return p*t;}void put(int x){int num[15],t=0;if (x<0) {putchar(45);//"-"x=-x;}if (x==0) putchar(48);while (x) num[t++]=x%10,x/=10;while (t--) putchar(num[t]+48);putchar(32);//" "}int main(){n=get();m=get();if (m>n) m=n;for (int i=1;i<=n;i++) a[i]=get();r=0;l=1;memset(q,0,sizeof q);for (int i=1;i<m;i++) ins1(i);for (int i=m;i<=n;i++){if (q[l]<i-m+1) l++;ins1(i);Min[i]=a[q[l]];}for (int i=m;i<=n;i++) put(Min[i]);putchar('\n');r=l=0;memset(q,0,sizeof q);for (int i=1;i<m;i++) ins2(i);for (int i=m;i<=n;i++){if (q[l]<i-m+1) l++;ins2(i);Max[i]=a[q[l]];}for (int i=m;i<=n;i++) put(Max[i]);putchar('\n');return 0;}

0 0
原创粉丝点击