洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)
To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window
题目描述
现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口。现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。
例如:
The array is [1 3 -1 -3 5 3 6 7], and k = 3.
输入输出格式
输入格式:
输入一共有两行,第一行为n,k。
第二行为n个数(<INT_MAX).
输出格式:
输出共两行,第一行为每次窗口滑动的最小值
第二行为每次窗口滑动的最大值
输入输出样例
8 3
1 3 -1 -3 5 3 6 7
-1 -3 -3 -3 3 3
3 3 5 5 6 7
说明
50%的数据,n<=10^5
100%的数据,n<=10^6
代码:
洛谷70分TLE的线段树
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=; int n,k,From,To,Min[N<<],Max[N<<]; void read(int &now)
{
now=;int f=;char c=getchar();
while(c<''||c>'')
{
if(c=='-')f=-;
c=getchar();
}
while(c>=''&&c<='')now=now*+c-'',c=getchar();
now*=f;
} inline void PushUp(int rt)
{
Min[rt]=min(Min[rt<<],Min[rt<<|]);
Max[rt]=max(Max[rt<<],Max[rt<<|]);
} void Build(int l,int r,int rt)
{
if(l==r)
{
int t;
read(t);
Min[rt]=Max[rt]=t;
return;
}
int m=(l+r)>>;
Build(l,m,rt<<);
Build(m+,r,rt<<|);
PushUp(rt);
} int QueryMax(int l,int r,int rt,int L,int R)
{
if(L<=l && r<=R) return Max[rt];
int m=(l+r)>>,res=(<<);
if(L<=m) res=max(res,QueryMax(l,m,rt<<,L,R));
if(m<R) res=max(res,QueryMax(m+,r,rt<<|,L,R));
return res;
} int QueryMin(int l,int r,int rt,int L,int R)
{
if(L<=l && r<=R) return Min[rt];
int m=(l+r)>>,res=(<<);
if(L<=m) res=min(res,QueryMin(l,m,rt<<,L,R));
if(m<R) res=min(res,QueryMin(m+,r,rt<<|,L,R));
return res;
} int main()
{
read(n);read(k);
Build(,n,);
//From=1;To=k;
for(register int i=;i<=n-k+;i++)//,From++,To++
printf("%d ",QueryMin(,n,,i,i+k-));
printf("\n");
//From=1;To=k;
for(register int i=;i<=n-k+;i++)//,From++,To++
printf("%d ",QueryMax(,n,,i,i+k-));
return ;
}
TLE
常数优化十分可观的zkw线段树(然而我不会用)
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=; int n,k,M,Tree[N<<]; void read(int &now)
{
now=;int f=;char c=getchar();
while(c>''||c<'')
{
if(c=='-')f=-;
c=getchar();
}
while(c>=''&&c<='')now=(now<<)+(now<<)+c-'',c=getchar();
now*=f;
} void BuildMin(int n)
{
for(int i=M-;i;--i)
Tree[i]=min(Tree[i<<],Tree[i<<|]);
} void BuildMax(int n)
{
for(int i=M-;i;--i)
Tree[i]=max(Tree[i<<],Tree[i<<|]);
} int QueryMin(int s,int t,int res)
{
for(s+=M,t+=M;s^t^;s>>=,t>>=)
{
if(~s&) res=min(res,Tree[s^]);
if(t&) res=min(res,Tree[t^]);
}
return res;
} int QueryMax(int s,int t,int res)
{
for(s+=M,t+=M;s^t^;s>>=,t>>=)
{
if(~s&) res=max(res,Tree[s^]);
if(t&) res=max(res,Tree[t^]);
}
return res;
} int main()
{
read(n);read(k);
for(M=;M<=n+;M<<=);
for(int i=M+;i<=M+n;i++)
read(Tree[i]);
BuildMin(n);
for(int i=;i<=n-k;++i)
printf("%d ",QueryMin(i,i+k+,1e9));
printf("\n");
BuildMax(n);
for(int i=;i<=n-k;++i)
printf("%d ",QueryMax(i,i+k+,-1e9));
return ;
}
AC
洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)的更多相关文章
- 洛谷——P1886 滑动窗口|| POJ——T2823 Sliding Window
https://www.luogu.org/problem/show?pid=1886#sub || http://poj.org/problem?id=2823 题目描述 现在有一堆数字共N个数字( ...
- [POJ2823][洛谷P1886]滑动窗口 Sliding Window
题目大意:有一列数,和一个窗口,一次能框连续的s个数,初始时窗口在左端,不断往右移动,移到最右端为止,求每次被框住的s个数中的最小数和最大数. 解题思路:这道题是一道区间查询问题,可以用线段树做.每个 ...
- 洛谷 P1886 滑动窗口(单调队列)
题目链接 https://www.luogu.org/problemnew/show/P1886 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始 ...
- 洛谷P1886滑动窗口
题目传送门 理解题意:给定一个数列和窗口范围k,求依次向右移动窗口时每次窗口内的最大和最小值. 没什么思维难度,一边扫过去,用两个数组maxx和minn记录每个窗口内的最大最小值,移动过程中用两个变量 ...
- 洛谷 P1886 滑动窗口
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- [洛谷P1886]滑动窗口 (单调队列)(线段树)
---恢复内容开始--- 这是很好的一道题 题目描述: 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口. 现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的 ...
- 洛谷 P1886 滑动窗口 (数据与其他网站不同。。)
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- 洛谷 P1886 滑动窗口(单调队列)
嗯... 题目链接:https://www.luogu.org/problem/P1886 首先这道题很典型,是标准的单调队列的模板题(也有人说单调队列只能解决这一个问题).这道题可以手写一个队列,也 ...
- 洛谷 P1886 滑动窗口 /【模板】单调队列
纯板子题,入队时保证单调性,即单调栈,出队保证题目条件,本题即窗口长度k,在入队出队时都可以维护信息 ; int buf[maxm], maxq[maxm], minq[maxm], ans1[max ...
随机推荐
- Linux mmc framework2:基本组件之mmc
1.前言 本文主要mmc组件的主要流程,在介绍的过程中,将详细说明和mmc相关的流程,涉及到其它组件的详细流程再在相关文章中说明. 2.主要数据结构和API TODO 3. 主要流程 3.1 mmc_ ...
- pyspider使用
#!/usr/bin/env python # -*- encoding: utf-8 -*- # Created on 2018-11-08 22:33:55 # Project: qsbk fro ...
- Win10 + Visual Studio 2017 下 OpenCV无法显示图像的问题
测试代码如下: #include "stdafx.h" #include<opencv2\opencv.hpp> #include<opencv2\highgui ...
- C:详解C中volatile关键字
原文地址:http://www.cnblogs.com/yc_sunniwell/archive/2010/06/24/1764231.html volatile提醒编译器它后面所定义的变量随时都有可 ...
- 利用excel办公软件快速拼凑sql语句
日常工作中经常会收到excel整理好的部门或者人员等数据信息并需要批量更新或者插入到数据库中,常用的办法有导入.脚本拼凑执行等,今天我介绍直接使用excel快速拼凑sql语句的方法 1.update批 ...
- LeetCode(5):最长回文子串
Medium! 题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 长度最长为1000. 示例: 输入: "babad" 输出: "bab&quo ...
- JAVA Random 随机类
nextInt 方法 得到一个随机整数, 可以指定范围 package object; import static net.util.Print.*; import java.util.Random; ...
- 多行文字溢出[...]的实现(text-overflow: ellipsis)
声明:此文章为转载(点击查看原文),如有侵权24小时内删除.联系QQ:1522025433. 对于单行文字, 很简单.(详见css3产考手册 进入) css: .oneLine { width: 20 ...
- python 全栈开发,Day20(object类,继承与派生,super方法,钻石继承)
先来讲一个例子 老师有生日,怎么组合呢? class Birthday: # 生日 def __init__(self,year,month,day): self.year = year self.m ...
- IDA Pro的patch插件 KeyPatch
本来这个是没什么可写的,但是安这个插件的时候真是气到爆炸,安装文档写的不明不白,几万行的代码都写了就差那么点时间写个几十字的详细说明吗? 1.下载keypatch.py放到\IDA\plugins里 ...