-
J - Sliding Window
- POJ - 2823
- 1、将队尾所有大于a[i]的值弹出队列
- 2、插入a[i]到队尾
- 3、判断队首元素位置是否超出i-k
- 交c++编译器恰好不超时
- 可以在进行插入a[i]到队尾时进行二分优化但是我这里队列只记录了下标,没有改动,可以建两个数组一个存值用来二分查询一个存下标用来检查是否在窗口内,这两个数组同步操作,(同入同出)
-
#include<stdio.h> #include<deque> #define maxn 1008666 int n,k,a[maxn],cnt; int q1[maxn],q2[maxn]; struct node { int x,y; } ans[maxn]; int main() { while(scanf("%d%d",&n,&k)!=EOF) { if(k<=0)continue; cnt=0; int head1=1,tail1=0,head2=1,tail2=0; for(int i=1; i<=n; i++) { scanf("%d",&a[i]); while(tail1>=head1&&a[q1[tail1]]<=a[i])tail1--; q1[++tail1]=i; while(i>=k&&q1[head1]<=(i-k))head1++; if(i>=k)ans[++cnt].x=a[q1[head1]]; while(tail2>=head2&&a[q2[tail2]]>=a[i])tail2--; q2[++tail2]=i; while(i>=k&&q2[head2]<=(i-k))head2++; if(i>=k)ans[cnt].y=a[q2[head2]]; } for(int i=1; i<cnt; i++) printf("%d ",ans[i].y); printf("%d \n",ans[cnt].y); for(int i=1; i<cnt; i++) printf("%d ",ans[i].x); printf("%d \n",ans[cnt].x); } return 0; }
J - Sliding Window POJ - 二分优化-单调队列
最新推荐文章于 2019-05-06 19:02:33 发布