uestc oj 1221 Sliding Window

 



  本题运用单调队列解决。
  由于需要输出最大值与最小值两个序列 ,于是需要维护两个分别是递增的和递减的单调队列。
  建立一个队列数组,数组元素是一个结构体,结构体的id信息用于保存这个队列元素在原数组中的坐标(主要作用在于比较对头元素是否符合要求。我曾经想在队列中直接保存数值)但是苦于无法获得head的id,因为它时刻的变动。
  首先将队列的首元素的id写成0,然后从1开始逐个加入逐个记录,维护递增队列的时候将逐个入队的元素与队尾的元素进行比较,如果大于队尾元素则替换队尾元素直到小于队尾元素,然后将其赋给队尾元素,再检查队头,如果对头元素与队尾元素之间的距离大于k,则head++,再将对头元素赋给相应位置的max[i]min[i].
  注意输出的时候最后一个元素不能带空格。



#include<cstdio>
#define N 1000005
using namespace std;

struct node
{
    int id;
};
node queue[N];
int s[N],max[N],min[N];
int a,k,tail,head;

//递减队列  求取最大值
void dec()
{
  head = tail =0;
  queue[tail++].id=0;
  max[0] = s[0];
  for(int i=1;i<a;i++)
  {
      while(s[queue[tail-1].id]<s[i]&&head<tail)
      {
          tail--;
      }
      queue[tail++].id =i;
      //去除多余的对头元素
      if(queue[head].id<i-k+1)
      head++;
      max[i] = s[queue[head].id];
  }
}

//递增队列 求取最小值
void inc()
{
  head = tail =0;
  queue[tail++].id=0;
  min[0] = s[0];
  for(int i=1;i<a;i++)
  {
      while(s[queue[tail-1].id]>s[i]&&head<tail)
      {
          tail--;
      }
      queue[tail++].id =i;
      //去除多余的对头元素
      if(queue[head].id<i-k+1)
      head++;
      min[i] = s[queue[head].id];
  }
}


int main()
{
    //freopen("1.txt","r",stdin);
    while(scanf("%d%d",&a,&k)==2)
    {
        int i;
        for(i=0;i<a;i++)
        scanf("%d",&s[i]);
        dec();
        inc();

        for(i=k-1;i<a-1;i++)
        printf("%d ",min[i]);
        printf("%d\n",min[i]);
        for(i=k-1;i<a-1;i++)
        printf("%d ",max[i]);
        printf("%d",max[i]);
    }
    return 0;
}



至于为什么要使用单调队列,当然是因为省时间,效率高。
如果采用暴力的解法解答这个题目的话,就会出现超时。
显然这个题目如果暴力的话需要O(n^2)的时间复杂度(两个for循环)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
互联网络程序设计是指在互联网上进行程序开发和设计的过程。UESTC则是我国的一所著名高校——电子科技大学。 互联网络程序设计 uestc包含了两个主要的方面:互联网络和程序设计。互联网络是指将多个计算机网络通过通信链路互相连接起来,实现信息共享和资源共享的网络系统。程序设计是指根据需求和目标,通过编写代码和设计算法,实现计算机程序的过程。 互联网络程序设计 uestc的学习内容主要包括以下几个方面: 1. 网络知识:学习互联网络的基本概念、原理和协议,如TCP/IP协议、HTTP协议等。掌握网络编程的基本技术,能够编写网络应用程序。 2. 数据通信:学习数据通信的基本原理和技术,包括数据传输的方式、数据压缩和加密等。了解网络安全和数据保护的基本知识。 3. 程序设计:学习编程语言和开发工具,如Java、C++和Python等。掌握常用的编程技巧和方法,能够设计和实现复杂的网络应用程序。 4. Web开发:学习Web开发的基本知识和技术,包括HTML、CSS、JavaScript等。能够设计和实现交互式的Web应用程序。 5. 数据库技术:学习数据库的基本原理和技术,如SQL语言和数据库管理系统。能够设计和管理数据库,实现数据的存储和检索。 通过学习互联网络程序设计 uestc,可以掌握互联网应用开发的基本技能,具备设计和实现网络应用程序的能力。这对于目前互联网行业的人才需求来说是非常重要的,也为学生提供了广阔的就业和创业机会。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值