POJ 2823 Sliding Window(单调队列 || 线段树)题解
题意:求每个长度为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(单调队列 || 线段树)题解的更多相关文章
- POJ 2823 Sliding Window + 单调队列
一.概念介绍 1. 双端队列 双端队列是一种线性表,是一种特殊的队列,遵守先进先出的原则.双端队列支持以下4种操作: (1) 从队首删除 (2) 从队尾删除 (3) 从队尾插入 (4) ...
- poj 2823 Sliding Window (单调队列入门)
/***************************************************************** 题目: Sliding Window(poj 2823) 链接: ...
- POJ 2823 Sliding Window (单调队列)
单调队列 加了读入挂比不加更慢.... 而且这份代码要交c++ 有大神G++跑了700ms..... orzorzorz #include<iostream> #include<cs ...
- poj 2823 Sliding Windows (单调队列+输入输出挂)
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 73426 Accepted: 20849 ...
- POJ 2823 Sliding Window 题解
POJ 2823 Sliding Window 题解 Description An array of size n ≤ 106 is given to you. There is a sliding ...
- 洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)
To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每 ...
- POJ 2823 Sliding Window (线段树/单调队列)
题目不说了,可以用线段树或者单调队列,下面附上代码. 线段树: #include <iostream> #include <stdio.h> #include <algo ...
- POJ 2823 Sliding Window 线段树
http://poj.org/problem?id=2823 出太阳啦~^ ^被子拿去晒了~晚上还要数学建模,刚才躺在床上休息一下就睡着了,哼,还好我强大,没有感冒. 话说今年校运会怎么没下雨!!!说 ...
- POJ 2823 Sliding Window(单调队列入门题)
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 67218 Accepted: 190 ...
随机推荐
- mybatis中大于等于、小于等于的写法
在xml格式中,常常会遇到xml解析sql时候出错,这个时候需要用其他符号来表示.在mybatis中会遇到,需要做如下的转换:
- form表单的enctype属性
①application/x-www-form-urlencoded : 数据被编码为名称/值对. ②multipart/form-data : 数据被编码为一条消息,页上的每个控件对应消息中的一个部 ...
- iOS中textbox文本框清除圆角
在iOS.Mac safari中,所有的textbox, select, checkbox都会被强制美化为圆角.但在特殊情况下需要清除圆角时发现iOS中使用以下传统的css无效: border-rad ...
- 【转】SVM入门(一)SVM的八股简介
(一)SVM的八股简介 支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维模式识别中表现出许多特有的优势,并能够 ...
- Toaster
https://wiki.opendaylight.org/view/YANG_Tools:YANG_to_Java_Mapping#Identity https://wiki.opendayligh ...
- Postman + newman + jenkins 的API自动化测试应用
一.环境配置 Postman postman 的具体使用可以参考另外一篇文章:postman 做接口测试之学习笔记 Newman 第一步,安装nodejs. 第二步,在nodejs命令行安装newma ...
- 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 ...
- JS参差不齐的数组
<html><head> <title>参差不齐的数组</title> <meta charset="utf-8"> & ...
- Linux下DNS服务器配置
一步:yum install -y bind bind-utils bind-chroot yum install bind* //安装DNS服务 第二步:systemctl stop firewal ...
- js 变量 作用域及内存
由于Javascript是松散型的,所以其变量只是在特定时间用于保存特定值的一个名字而已,并不存在某个变量必须保存某种类型的值的规则,变量的值以及其数据类型都可以在脚本的声明周期内改变 一.基本类型与 ...