码迷,mamicode.com
首页 > Windows程序 > 详细

poj 2823 Sliding Window

时间:2015-09-02 22:04:13      阅读:257      评论:0      收藏:0      [点我收藏+]

标签:

poj 2823 Sliding Window

单调队列

单调队列是一个单调的状态(递增,或者递减)

所以需要维护这么一个状态

http://baike.baidu.com/link?url=ZcGM7Hzo8zVQUU6Oqqq18SlCMJ92ts3I1aXwQGDZw_NiDDlzIIV9GKlfs3X1fcHVppZHOU31geHZG4cOcRZOAK

固定 k 区间的单调 队列,求 最小值,如果 两个元素 A B ,如果 A 的 下标 比 B 小,但是 A 的 值 比 B 大,那么在固定的 区间里面,A的值是没有意义的,所以应该把 A删除……

删除队尾,使新加入的元素保持队列的单调性。队首元素是最值

技术分享
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <queue>
#include <deque>
using namespace std;
const int MAXN = 10e6+10;
int arr[MAXN];
int main(){
//    freopen("input.txt","r",stdin);
    int n,k;
    while(~scanf("%d%d",&n,&k)){
        for(int i=0;i<n;i++){
            scanf("%d",&arr[i]);
        }
        deque<int>dq;
        //最小
        for(int i=0;i<k-1;i++){
            while(!dq.empty() && dq.back()>arr[i]){
                dq.pop_back();
            }
            dq.push_back(arr[i]);
        }
        for(int i=k-1;i<n;i++){
            while(!dq.empty() && dq.back()>arr[i]){
                dq.pop_back();
            }
            dq.push_back(arr[i]);
            if(i==k-1){
                printf("%d",dq.front());
            }else{
                printf(" %d",dq.front());
            }
            if(arr[i-k+1] == dq.front()){
                dq.pop_front();
            }
        }
        while(!dq.empty()){
            dq.pop_back();
        }
        printf("\n");
        for(int i=0;i<k-1;i++){
            while(!dq.empty() && dq.back()<arr[i]){
                dq.pop_back();
            }
            dq.push_back(arr[i]);
        }
        for(int i=k-1;i<n;i++){
            while(!dq.empty() && dq.back()<arr[i]){
                dq.pop_back();
            }
            dq.push_back(arr[i]);
            if(i==k-1){
                printf("%d",dq.front());
            }else{
                printf(" %d",dq.front());
            }
            if(arr[i-k+1] == dq.front()){
                dq.pop_front();
            }
        }
        printf("\n");
    }
    return 0;
}
C++

删除队尾时候用数组,二分会好一点 = = 

poj 2823 Sliding Window

标签:

原文地址:http://www.cnblogs.com/hanbinggan/p/4779426.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!