poj 2823 (单调队列)
2012-08-29 09:25
323 查看
原来这个是单调队列,第一次写,纪念一下。
#include<stdio.h> typedef struct { int key,tag; }Node; Node node[1000010]; int a[1000010]; int mn[1000010],mx[1000010]; int main() { int n,k,i,j,head,tail,h,idx; scanf("%d%d",&n,&k); for(i=1;i<=n;i++) scanf("%d",a+i); ead=1;tail=0;i=1;j=0; idx=1; //维护递减的队列; i和j 分别是队首和队尾在原序列中的下标 for(h=1;h<=k;h++) //head和tail是递减序列的头和尾 { while( head<=tail && node[tail].key < a[h] ) tail--; node[++tail].key=a[h]; node[tail].tag=++j; } mx[idx]=node[head].key; idx++; for(h=k+1;h<=n;h++) { if(node[head].tag==i) head++; i++; while(head<=tail && node[tail].key < a[h]) tail--; node[++tail].key=a[h]; node[tail].tag=++j; mx[idx++]=node[head].key; } head=1;tail=0;i=1;j=0; idx=1; //维护递增的单调队列 for(h=1;h<=k;h++) { while( head<=tail && node[tail].key > a[h] ) tail--; node[++tail].key=a[h]; node[tail].tag=++j; } mn[idx]=node[head].key; idx++; for(h=k+1;h<=n;h++) { if(node[head].tag==i) head++; i++; while(head<=tail && node[tail].key > a[h]) tail--; node[++tail].key=a[h]; node[tail].tag=++j; mn[idx++]=node[head].key; } for(i=1;i<=n-k+1;i++) printf("%d ",mn[i]); printf("\n"); for(i=1;i<=n-k+1;i++) printf("%d ",mx[i]); return 0; }
相关文章推荐
- POJ 2823 Sliding Window - dp&单调队列优化
- POJ 2823(单调队列)
- POJ[2823]窗口 单调队列
- 【单调队列】POJ 2823 Sliding Window
- POJ - 2823 Sliding Window(单调队列)
- poj 2823 Sliding Window (单调队列)
- POJ 2823:Sliding Window 单调队列
- poj 2823 Sliding Window 单调队列
- Poj 2823 Sliding Window【单调队列学习】模板记录
- POJ 2823 Sliding Window(单调队列)
- POJ - 2823 Sliding Window: 滑动窗口 单调队列
- POJ 2823 Sliding Window 单调队列
- poj 2823单调队列模板题
- POJ 2823:Sliding Window 单调队列
- poj 2823 Sliding Window (单调队列 or 线段树)
- POJ 2823 UESTCoj 1221 Sliding Window 单调队列 经典入门题
- POJ-2823 Sliding Window 单调队列
- Poj 2823 (单调队列)
- POJ 2823 Sliding Window 堆 / 单调队列
- POJ 2823 Sliding Window(单调队列)