题意:求每个长度为k的数组的最大值和最小值

思路:

1.用线段树创建维护最大值和最小值,遍历询问,简单复习了一下...有点手生

2.单调队列:

可以看一下详解

单调队列顾名思义就是一个单调递增或者递减的队列,我们可以通过队列瞬间得到当前队列的最大值和最小值。以查找当前区间最小值为例,我们需要维护一个递增的队列,那么当前队列队首就是最小值。在维护队列的过程中要注意:

1、如果队列的长度一定,要判断队首元素是否在规定范围内,如果超范围则队首移动,直到在范围内为止。

2、每次加入元素时和队尾比较,如果队尾元素大于要插入的元素且队列非空,则队尾元素依次出队,直到满足队列的单调性为止,这是为了保证队列的单调性。

线段树:

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int N = 1e6+5;
int n,k,Max[N<<2],Min[N<<2],ansMa[N],ansMi[N],cnt;
void build(int l,int r,int rt){
if(l == r){
int a;
scanf("%d",&a);
Max[rt] = Min[rt] = a;
return;
}
int m = (l + r) / 2;
build(l,m,rt<<1);
build(m+1,r,rt<<1|1);
Max[rt] = max(Max[rt<<1],Max[rt<<1|1]);
Min[rt] = min(Min[rt<<1],Min[rt<<1|1]);
}
int queryMa(int L,int R,int l,int r,int rt){
if(l == r) return Max[rt];
if(L <= l && R >= r){
return Max[rt];
}
int m = (l + r) / 2;
int MAX = -1e8;
if(L <= m) MAX = max(MAX,queryMa(L,R,l,m,rt<<1));
if(R > m) MAX = max(MAX,queryMa(L,R,m+1,r,rt<<1|1));
return MAX;
}
int queryMi(int L,int R,int l,int r,int rt){
if(l == r) return Min[rt];
if(L <= l && R >= r){
return Min[rt];
}
int m = (l + r) / 2;
int MIN = 1e8;
if(L <= m) MIN = min(MIN,queryMi(L,R,l,m,rt<<1));
if(R > m) MIN = min(MIN,queryMi(L,R,m+1,r,rt<<1|1));
return MIN;
}
int main(){
while(~scanf("%d%d",&n,&k)){
build(1,n,1);
for(int i = 1,j = k;i <= n-k+1;i++,j++){
ansMa[i] = queryMa(i,j,1,n,1);
ansMi[i] = queryMi(i,j,1,n,1);
}
for(int i = 1;i <= n-k+1;i++){
printf("%d ",ansMi[i]);
}
printf("\n");
for(int i = 1;i <= n-k+1;i++){
printf("%d ",ansMa[i]);
}
printf("\n");
}
return 0;
}

单调队列:

#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
const int N = 1e6+5;
int a[N],q[N],pos[N],n,k;
int MAX[N],MIN[N];
void get_max(){ //单调递减队列
int head,tail;
head = tail = 0; //tail指向队尾(空)
for(int i = 1;i < k;i++){
while(head < tail && q[tail - 1] <= a[i]) //保证递减
tail--;
q[tail] = a[i];
pos[tail++] = i; //记录个数的位置,为后续查找q[head]是否超出范围准备
}
for(int i = k;i <= n;i++){
while(head < tail && q[tail - 1] <= a[i])
tail--;
q[tail] = a[i];
pos[tail++] = i;
while(head < tail && pos[head] < i-k+1)
head++;
MAX[i-k] = q[head];
}
for(int i = 0;i < n-k+1;i++) printf("%d ",MAX[i]);
printf("\n");
}
void get_min(){ ////单调递增队列
int head,tail;
head = tail = 0;
for(int i = 1;i < k;i++){
while(head < tail && q[tail - 1] >= a[i]) //保证递增
tail--;
q[tail] = a[i];
pos[tail++] = i;
}
for(int i = k;i <= n;i++){
while(head < tail && q[tail - 1] >= a[i])
tail--;
q[tail] = a[i];
pos[tail++] = i;
while(head < tail && pos[head] < i-k+1)
head++;
MIN[i-k] = q[head];
}
for(int i = 0;i < n-k+1;i++) printf("%d ",MIN[i]);
printf("\n");
}
int main(){
while(~scanf("%d%d",&n,&k)){
for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
get_min();
get_max();
}
return 0;
}

POJ 2823 Sliding Window(单调队列 || 线段树)题解的更多相关文章

  1. POJ 2823 Sliding Window + 单调队列

    一.概念介绍 1. 双端队列 双端队列是一种线性表,是一种特殊的队列,遵守先进先出的原则.双端队列支持以下4种操作: (1)   从队首删除 (2)   从队尾删除 (3)   从队尾插入 (4)   ...

  2. poj 2823 Sliding Window (单调队列入门)

    /***************************************************************** 题目: Sliding Window(poj 2823) 链接: ...

  3. POJ 2823 Sliding Window (单调队列)

    单调队列 加了读入挂比不加更慢.... 而且这份代码要交c++ 有大神G++跑了700ms..... orzorzorz #include<iostream> #include<cs ...

  4. poj 2823 Sliding Windows (单调队列+输入输出挂)

    Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 73426   Accepted: 20849 ...

  5. POJ 2823 Sliding Window 题解

    POJ 2823 Sliding  Window 题解 Description An array of size n ≤ 106 is given to you. There is a sliding ...

  6. 洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)

    To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每 ...

  7. POJ 2823 Sliding Window (线段树/单调队列)

    题目不说了,可以用线段树或者单调队列,下面附上代码. 线段树: #include <iostream> #include <stdio.h> #include <algo ...

  8. POJ 2823 Sliding Window 线段树

    http://poj.org/problem?id=2823 出太阳啦~^ ^被子拿去晒了~晚上还要数学建模,刚才躺在床上休息一下就睡着了,哼,还好我强大,没有感冒. 话说今年校运会怎么没下雨!!!说 ...

  9. POJ 2823 Sliding Window(单调队列入门题)

      Sliding Window Time Limit: 12000MS   Memory Limit: 65536K Total Submissions: 67218   Accepted: 190 ...

随机推荐

  1. mybatis中大于等于、小于等于的写法

    在xml格式中,常常会遇到xml解析sql时候出错,这个时候需要用其他符号来表示.在mybatis中会遇到,需要做如下的转换:

  2. form表单的enctype属性

    ①application/x-www-form-urlencoded : 数据被编码为名称/值对. ②multipart/form-data : 数据被编码为一条消息,页上的每个控件对应消息中的一个部 ...

  3. iOS中textbox文本框清除圆角

    在iOS.Mac safari中,所有的textbox, select, checkbox都会被强制美化为圆角.但在特殊情况下需要清除圆角时发现iOS中使用以下传统的css无效: border-rad ...

  4. 【转】SVM入门(一)SVM的八股简介

    (一)SVM的八股简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维模式识别中表现出许多特有的优势,并能够 ...

  5. Toaster

    https://wiki.opendaylight.org/view/YANG_Tools:YANG_to_Java_Mapping#Identity https://wiki.opendayligh ...

  6. Postman + newman + jenkins 的API自动化测试应用

    一.环境配置 Postman postman 的具体使用可以参考另外一篇文章:postman 做接口测试之学习笔记 Newman 第一步,安装nodejs. 第二步,在nodejs命令行安装newma ...

  7. Fuzzy and fun on Air Jordan 12 Doernbecher design

    Carissa Navarro keeps it warm, fuzzy and fun on her 2017 Air Jordan 12 Doernbecher design. Nike's 20 ...

  8. JS参差不齐的数组

    <html><head> <title>参差不齐的数组</title> <meta charset="utf-8"> & ...

  9. Linux下DNS服务器配置

    一步:yum install -y bind bind-utils bind-chroot yum install bind* //安装DNS服务 第二步:systemctl stop firewal ...

  10. js 变量 作用域及内存

    由于Javascript是松散型的,所以其变量只是在特定时间用于保存特定值的一个名字而已,并不存在某个变量必须保存某种类型的值的规则,变量的值以及其数据类型都可以在脚本的声明周期内改变 一.基本类型与 ...