zoukankan      html  css  js  c++  java
  • Sliding Window POJ

    Sliding Window POJ - 2823 单调队列模板题

    题意

    给出一个数列 并且给出一个数m 问每个连续的m中的最小最大值是多少,并输出

    思路

    使用单调队列来写,拿最小值来举例
    要求区间最小值 就是维护一个单调递增的序列
    对于样例

    8 3  
    1 3 -1 -3 5 3 6 7
    

    我们先模拟一遍
    1.队列为空 1 进队 队列:1
    2.3>队尾元素 3 进队 队列: 1 3
    3.-1小于队尾元素,一直从尾部出队知道找到比-1小的元素或者队列为空 队列:-1
    当队列中元素大于m的时候从队头删除元素直到队列元素小于等于m
    每次操作完后取队头元素就是m区间的最小值

    原理

    这里其实运用了一种贪心和时间的思想
    当要进区间的数小于之前队列里的所有的数的时候,这个时候之前的数都没用了,因为只要包括了这个数的区间,最小值一定是小于等于这个数的,而窗口已经滑动了包括这个数了,所以之前包括这个数的区间的大于其的值都可以舍弃了
    当要进区间的数不是小于之前队列里的所有的数的时候,比这个数小的数如果条件允许(也就是队列小于等于m)要保留,因为这个时候窗口最小的数是队列头的数,而进区间的数是区间第k小,只有当窗口不包括最小的这个数,队头才能出队

    这其实运用了一种时间的概念(也可是说是窗口位置的变化趋势)把没有营养的元素剔除了,维护了一个单调增队列相当于维护了一个 rank ,当rank高的被封号了(窗口不包括前面的数)或者rank高的之前封号的解封了(窗口包括后面的数)rank 低的才能上来。

    #include<cstdio>
    #include<iostream>
    using namespace std;
    	int n,m;
    	const int maxn=1e6+7;
    	int a[maxn],q[maxn];
    void getmin(){
    	int head=1,tail=0;
    
    	for(int i=1;i<=n;i++){
    		if(tail<head)q[++tail]=i;
    		else {
    			while(tail>=head&&i-q[head]+1>m)head++;
    			while(tail>=head&&a[q[tail]]>a[i])tail--;
    			q[++tail]=i;
    		}
    		if(i>=m){
    			printf("%d ",a[q[head]]);
    		}
    	}
    }
    void getmax(){
    	int head=1,tail=0;
    	for(int i=1;i<=n;i++){
    		if(tail<head)q[++tail]=i;
    		else {
    			while(tail>=head&&i-q[head]+1>m)head++;
    			while(tail>=head&&a[q[tail]]<a[i])tail--;
    			q[++tail]=i;
    		}
    		if(i>=m){
    			printf("%d ",a[q[head]]);
    		}
    	}
    }
    int main(){
    	scanf("%d%d",&n,&m);
    	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    	getmin();
    	cout<<endl;
    	getmax();
    	return 0;
    }
    
    
  • 相关阅读:
    python调用c/c++库函数方法小结(c++和python的整合)
    一个机器学习的好网站
    Notepad++支持列选择模式
    awk的效率和python split 效率对比
    python 中的反射,装饰器,with语句
    hierarchy 在大数据上聚类的利弊
    shell 某个日期前的某一天(待补充)
    通过 cgi 运行 python 在lighttp上
    (译)Node.js的全局变量
    (译)Node.js的模块-exports和module.exports
  • 原文地址:https://www.cnblogs.com/ttttttttrx/p/10802081.html
Copyright © 2011-2022 走看看