poj 2823 Sliding Window (单调队列)

详见

 

http://blog.chinaunix.net/u3/105033/showart_2208489.html

 

我的基本就是他代码改改。。改进了点。自己写的过不去 = =。。

 

 

#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> #define MAX 1000005 int arr[MAX]; int Minq[MAX],Maxq[MAX]; int n,k; int Ind[MAX]; int Q[MAX]; void MMin() { int head = 1,tail = 0; for(int i=1; i<=n; i++) { while( head <= tail && Q[tail] > arr[i] ) tail--; tail++; Q[tail] = arr[i]; Ind[tail] = i; if( i >= k ) { while( Ind[head] <= i-k ) head++; Minq[i-k] = Q[head]; } } } void MMax() { int head = 1,tail = 0; for(int i=1; i<=n; i++) { while( head <= tail && Q[tail] < arr[i] ) tail--; tail++; Q[tail] = arr[i]; Ind[tail] = i; if( i >= k ) { while( Ind[head] <= i-k ) head++; Maxq[i-k] = Q[head]; } } } int main(void) { while(scanf("%d%d",&n,&k)!=EOF) { if( k > n ) k = n; for(int i=1; i<=n; i++) scanf("%d",&arr[i]); MMin(); MMax(); for(int i=0; i<n-k+1; i++) printf("%d%c", Minq[i], (i < n - k) ? ' ' : '/n'); for(int i=0; i<n-k+1; i++) printf("%d%c", Maxq[i], (i < n - k) ? ' ' : '/n'); } return 0; }  

你可能感兴趣的:(c)