因为不太好复制,我就直接截图了,题目链接;题目大致的意思是:给一串数字,然后要你求出每k长度的连续子序列中的最大值以及最小值并输出;这题就是一个最简单的运用单调队列方法解题的例子。

解题思路:通过单调队列,分别维护一个递增以及递减的数列以求得最小值和最大值(增减对应),其中用到了数组的游标删减,主要思想是通过一个f[]数组存储每次比较得出的最值,通过t[]数组存储游标(即变化的数组下标);

代码:

#include<cstdio>
#include<cstdlib>
#include<memory.h>
#define Max_Size 1000000
int t[Max_Size];
int f[Max_Size];
int num[Max_Size]; int main()
{
int n,k;
int i,j;
int min,max;
scanf("%d%d",&n,&k);
for(i=0;i<n;i++)
{
scanf("%d",&num[i]);
}
int tail=0,front=0;
for(i=0;i<n;i++)
{
while(front<tail&&f[tail-1]>num[i])tail--; //维护一个单调递增的序列,最后求得最小值;
f[tail]=num[i]; //每次这个数要么替换f[]中的数,要么直接加入,因此始终都是要加入到队列中,对其大小处理在后一个过程中的while()中处理;
t[tail]=i;
tail++;
while(t[front]<=i-k)front++;
if(i>k-2) //每三个数都要输出其中的最小值(即从第三个数开始);
{
printf("%d%c",f[front],i==n-1?'\n':' ');
}
}
tail=0;front=0;
memset(f,0,sizeof(f));
memset(t,0,sizeof(t));
for(i=0;i<n;i++)
{
while(front<tail&&f[tail-1]<num[i])tail--;
f[tail]=num[i];
t[tail]=i;
tail++;
while(t[front]<=i-k)front++;
if(i>k-2)
{
printf("%d%c",f[front],i==n-1?'\n':' ');
}
}
return 0;
}

后续还有单调队列题目将会更新,并将链接附上;

POJ2823(单调队列方法解题)的更多相关文章

  1. 刷题向》POJ2823 单调队列裸题(<不会做,请自裁>系列)

    最近BZOJ炸了,而我的博客上又更新了一些基本知识,所以这里刷一些裸题,用以丰富知识性博客 POJ2823   滑动的窗口 这是一道经典的单调队题,我记得我刚学的时候就是用这道题作为单调队列的例题,算 ...

  2. POJ2823 单调队列

    POJ2823 http://poj.org/problem?id=2823 最基础的单调队列,说是数据结构,其实就是一种更新数组数据的方法. 之前还准备用deque,超时了,直接head,tail快 ...

  3. poj2823 单调队列初步

    什么是单调队列:头元素一直是队列当中的最大值,队列中的值按照递减顺序排列,可以从末尾插入一个元素,或从两段删除元素 1.插入元素,为了保证队列的单调性(这里假设为递减性),在插入元素v时要将对位的元素 ...

  4. poj2823单调队列

    这个裸题,滑动窗口求最大最小值,单调队列来两边,一次单调递增q[s]就是最小值,一次单调递减q[s]就是最大值 cin会超时,解除同步也没用... #include<map> #inclu ...

  5. P1886 滑动窗口 /【模板】单调队列 方法记录

    原题链接 滑动窗口 /[模板]单调队列 题目描述 有一个长为 \(n\) 的序列 \(a\),以及一个大小为 \(k\) 的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最 ...

  6. poj2823单调队列认知

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 62930   Accepted: 17963 ...

  7. HDU 4193 Non-negative Partial Sums(想法题,单调队列)

    HDU 4193 题意:给n个数字组成的序列(n <= 10^6).求该序列的循环同构序列中,有多少个序列的随意前i项和均大于或等于0. 思路: 这题看到数据规模认为仅仅能用最多O(nlogn) ...

  8. 单调队列(数列中长度不超过k的子序列和的最值)

    ★实验任务 小 F 很爱打怪,今天因为系统 bug,他提前得知了 n 只怪的出现顺序以及击 倒每只怪得到的成就值 ai.设第一只怪出现的时间为第 1 秒,这个游戏每过 1 秒 钟出现一只新怪且没被击倒 ...

  9. 【HDU6701】Make Rounddog Happy【权值线段树+双向单调队列】

    题意:给你一个序列,求满足要求的子序列个数,其中要求为: 1.子序列的max-子序列长度len<=k 2.子序列中不出现重复的数字 题解:首先看到子序列max,很容易想到枚举最大值然后分治,这个 ...

随机推荐

  1. K近邻算法小结

    什么是K近邻? K近邻一种非参数学习的算法,可以用在分类问题上,也可以用在回归问题上. 什么是非参数学习? 一般而言,机器学习算法都有相应的参数要学习,比如线性回归模型中的权重参数和偏置参数,SVM的 ...

  2. Python 学习计划

    时间分为4周,全部自学,仅提供大纲.适用于Web方向: 1.Week1:读完<简明Python教程>,适应Python开发环境 2.Week2:写个爬虫,需要深入了解re.urllib2. ...

  3. 2 vue 。js

    元素option el element    混淆 webpack 项目依赖 save 开发依赖 虚拟dom的问题 在js的基础上封装的,不是jquery 整个网页就一个实例化对象 v 下一张 怎么做 ...

  4. 【FJOI2016】建筑师

    安利另外一篇\(blog\) 密码泥萌都知道 题面 题解 为了描述方便,这里将建筑称作\(zsy\) 高度为\(n\)的\(zsy\)无论如何都能从左右两侧看到.剩下的部分,从左边看到的是前缀\(ma ...

  5. [NOI2016]区间 线段树

    [NOI2016]区间 LG传送门 考虑到这题的代价是最长边减最短边,可以先把边按长度排个序,双指针维护一个尺取的过程,如果存在包含某个点的区间数\(\ge m\),就更新答案并把左指针右移,这样做的 ...

  6. javascript中encodeURI和decodeURI方法使用介绍

    encodeURI和decodeURI是成对来使用的,因为浏览器的地址栏有中文字符的话,可以会出现不可预期的错误, 所以可以encodeURI把非英文字符转化为英文编码,decodeURI可以用来把字 ...

  7. SpringBoot之MongoTemplate的查询可以怎么耍

    学习一个新的数据库,一般怎么下手呢?基本的CURD没跑了,当可以熟练的增.删.改.查一个数据库时,可以说对这个数据库算是入门了,如果需要更进一步的话,就需要了解下数据库的特性,比如索引.事物.锁.分布 ...

  8. JMeter转制LoadRunner HTTP协议脚本的小技巧

    对于Http协议的请求,除了手工编写脚本外,JMeter还提供了录制浏览器操作的功能,甚是方便.那如果手头有一堆HTTP协议的LoadRunner脚本,能不能比较快速的转制成JMeter脚本呢?其实也 ...

  9. MapReduce 基础学习

      什么是MapReduce? mapreduce 是一种软件框架 mapreduce job将任务分解为独立的块儿到不同的map task,进行并行处理: map任务输出会做相应的排序处理,并作为r ...

  10. oracle数据库之子查询

    子查询也叫内部查询,在主查询之前执行一次并得到结果,此结果一般情况下,是用来当做是主查询的条件.   -- 在 emp 表中,找出工资比 ALLEN 的高? -- 先查出 ALLEN 的工资是多少? ...