以前也碰到过这种类型的题目,以前好像做出来过,但是忘记了,这次又坑了。

题目很简单,对于从前到后每一个连续的长度为k的数字,求出这段数字中的最大的数字和最小的数字。

一开始我用离散化+树状数组来更新和查询,时间复杂度为n*log(n)*log(n)。这尼玛果断T啊。

后来才发现,没那么复杂哦。其实是用一个优先队列来解决问题的。

什么意思呢?对于初始状态,我们可以加入k-1个元素,然后每次加一个元素,进行弹出和查询的操作。

首先我们创建两个队列,分别用来解决最大值和最小值的问题。

这里只需要说明一下最小值的队列就可以了,最大值队列同理。

假如当前我们要加入一个新的元素x,我们只需要将x与队尾的元素进行比较,如果我们发现x小于队尾的元素,那么显然队尾的那个元素是没有用的,可以直接删除。为什么?因为对于当前加入的x,接下来的所有询问中,有队员元素在的询问一定有x在,也就是说无论如何队尾元素都不会是最小值,我们可以直接删除。

有了上面的这条性质,我们就可以发现这个优先队列的性质就是前面的数字总是小于后面的数字,所以。。。。

查询的时候,最小的数字就是队首的元素。

接下来还有一个删除的操作,这个更加简单,我们只要判断队首的元素与当前加入的这个数的位置,看看差值是不是大于或等于k就可以决定这个数是不是需要删除了。

 #include <cstdio>
#define M 1000005
using namespace std; int q1[M],q2[M],H1,H2,T1,T2;
int a[M],n,k;
int ans1[M],ans2[M]; int main()
{
scanf("%d%d",&n,&k);
H1=H2=;
T1=T2=;
for (int i=; i<=n; i++)
{
scanf("%d",&a[i]);
while (a[q1[T1]]>=a[i] && T1>=H1) T1--;
while (a[q2[T2]]<=a[i] && T2>=H2) T2--;
q1[++T1]=q2[++T2]=i;
if (q1[H1]+k<=i) H1++;
if (q2[H2]+k<=i) H2++;
ans1[i]=a[q1[H1]],ans2[i]=a[q2[H2]];
}
printf("%d",ans1[k]);
for (int i=k+; i<=n; i++) printf(" %d",ans1[i]);
printf("\n%d",ans2[k]);
for (int i=k+; i<=n; i++) printf(" %d",ans2[i]);
printf("\n");
}

POJ2823_Sliding Window的更多相关文章

  1. [虾扯蛋] android界面框架-Window

    从纯sdk及framwork的角度看,android中界面框架相关的类型有:Window,WindowManager,View等.下面就以这几个类为出发点来概览下安卓开发的"界面架构&quo ...

  2. JS判断鼠标进入容器方向的方法和分析window.open新窗口被拦截的问题

    1.鼠标进入容器方向的判定 判断鼠标从哪个方向进入元素容器是一个经常碰到的问题,如何来判断呢?首先想到的是:获取鼠标的位置,然后经过一大堆的if..else逻辑来确定.这样的做法比较繁琐,下面介绍两种 ...

  3. 谈谈document.ready和window.onload的区别

    在Jquery里面,我们可以看到两种写法:$(function(){}) 和$(document).ready(function(){}) 这两个方法的效果都是一样的,都是在dom文档树加载完之后执行 ...

  4. X Window 的奥秘

    大名鼎鼎的 X Window 大家肯定不陌生.都知道它是 Unix/Linux 下面的窗口系统,也都知道它基于 Server/Clinet 架构.在网上随便搜一搜,也可以找到不少 X Window 的 ...

  5. Android Starting Window(Preview Window)

    当打开一个Activity时,如果这个Activity所属的应用还没有在运行,系统会为这个Activity所属的应用创建一个进程,但进程的创建与初始化都需要时间,在这个动作完成之前系统要做什么呢?如果 ...

  6. JavaScript权威设计--Window对象之Iframe(简要学习笔记十四)

    1.Window对象属性的文档元素(id) 如果在HTML文档中用id属性来为元素命名,并且如果Window对象没有此名字的属性,Window对象会赋予一个属性,它的名字是id属性的值,而他们的值指向 ...

  7. JavaScript权威设计--Window对象(简要学习笔记十三)

    1.Window对象是所有客户端JavaScript特性和API的主要接入点. Window对象中的一个重要属性是document,它引用Document对象. JavaScript程序可以通过Doc ...

  8. $(document).ready() 与window.onload的区别

    1.执行时间 window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行. $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕. 2.编写个数不同 ...

  9. window.name实现的跨域数据传输

    这篇文章是对 JavaScript跨域总结与解决办法 的补充. 有三个页面: a.com/app.html:应用页面. a.com/proxy.html:代理文件,一般是一个没有任何内容的html文件 ...

随机推荐

  1. 学号20155311 2016-2017-2 《Java程序设计》第4周学习总结

    教材学习内容总结 6.1 何谓继承 何谓继承 面向对象中,子类继承父类,避免重复的行为定义,不过并非为了避免重复定义行为就使用继承,滥用继承而导致程序维护上的问题时有所闻.如何正确判断使用继承的时机, ...

  2. 课上实践练习——MySort

    模拟实现Linux下Sort -t : -k 2的功能.参考 Sort的实现.提交码云链接和代码运行截图. Linux下Sort -t : -k 2的功能 sort的工作原理: sort将文件的每一行 ...

  3. crontab练习题

    Crontab练习题 每周一到周六的凌晨3点20分,运行tar命令对/etc/目录进行存档另存,存储位置为/backups/etc-YYYY-MM-DD.tar.gz 20 3 * * 1-6 /us ...

  4. angular之$watch() $watchGroup()和$watchCollection()

    $watch $watch主要是用来监听一个对象,在对象发生变化时触发某个事件. 用法: $scope.$watch(watchFn,watchAction, deepWatch) 接下来讲一下这几个 ...

  5. SQL创建数据库、建表、填入内容

    --创建数据库 create database Information go --使用数据库 use Information go --创建表 create table Student ( Sno ) ...

  6. 三边定位 c#

    MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分. 项目中用到三 ...

  7. HBASE理论篇

    1.Hbase是什么 HBase是一种构建在HDFS之上的分布式.面向列的存储系统.在需要实时读写.随机访问超大规模数据集时,可以使用HBase. 尽管已经有许多数据存储和访问的策略和实现方法,但事实 ...

  8. 爬虫2.5-scrapy框架-下载中间件

    目录 scrapy框架-下载中间件 scrapy框架-下载中间件 middlewares.py中有两个类,一个是xxSpiderMiddleware类 一个是xxDownloaderMiddlewar ...

  9. [shell] 循环判断输入值

    做个记录 until [[ $flag == "yes" || $flag == "exit" ]] do read -p "请确认统一/合服前后数据 ...

  10. 王者荣耀交流协会 - 第6次Scrum会议

    Scrum master :刘耀泽 补充:由于上次的scrum会议博客没有按时交上去,因此在这里给出上次scrum会议的链接: http://www.cnblogs.com/rensijia/p/76 ...