zoukankan      html  css  js  c++  java
  • [模板]单调队列

    洛谷 P1886

    题目描述

    现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。

    例如:

    The array is [1 3 -1 -3 5 3 6 7], and k = 3.

    输入输出格式

    输入格式:

    输入一共有两行,第一行为n,k。

    第二行为n个数(<INT_MAX).

    输出格式:

    输出共两行,第一行为每次窗口滑动的最小值

    第二行为每次窗口滑动的最大值

    输入输出样例

    输入样例#1: 
    8 3
    1 3 -1 -3 5 3 6 7
    输出样例#1: 
    -1 -3 -3 -3 3 3
    3 3 5 5 6 7

    说明

    50%的数据,n<=10^5

    100%的数据,n<=10^6

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    using namespace std;
    #define read(x) scanf("%d",&x)
    #define readl(x) scanf("%lld",&x)
    #define man 1000010
    int n,m,k;
    long long a[man];
    struct node
    {	long long id,val;}qmin[man],qmax[man];
    inline void getmin()
    {	int head=1,tail=0;
    	for(int i=1;i<=n;i++)
    	{	while(tail>=head&&a[i]<=qmin[tail].val) tail--;
    		qmin[++tail].val=a[i];qmin[tail].id=i;
    		if(i-qmin[head].id+1>k) head++;//如果尾指针-头指针>k,那么头指针向后移
    		if(i>=k) printf("%lld ",qmin[head].val);//输出包括q[head].id向后k位的区间的最值
    		}
    	printf("
    ");
    	return ;   
    	}
    inline void getmax()
    {	int head=1,tail=0;
    	for(int i=1;i<=n;i++)
    	{	while(tail>=head&&a[i]>=qmax[tail].val) tail--;
    		qmax[++tail].val=a[i];qmax[tail].id=i;
    		if(i-qmax[head].id+1>k) head++;
    		if(i>=k) printf("%lld ",qmax[head].val);
    		}
    	printf("
    ");
    	return ;   
    	}
    int main()
    {	read(n);read(k);
    	for(int i=1;i<=n;i++)
     	{	readl(a[i]);
    		 }
    	 getmin();
    	 getmax();
    	 return 0;
    	 } 
    

      

  • 相关阅读:
    eclipse中切换jdk版本
    201704 创建财务凭证函数
    201704 F-47创建预付款申请a
    201704 F-02创建财务凭证
    20170413 F110学习
    20170411 F110初始界面-建议清单
    20170411 供应商保证金维护视图
    20170411 F-02创建财务凭证
    ABAP 断点篇-001
    20170411 debug窗口执行文件
  • 原文地址:https://www.cnblogs.com/Slager-Z/p/7787692.html
Copyright © 2011-2022 走看看