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).

输出格式:

输出共两行,第一行为每次窗口滑动的最小值

第二行为每次窗口滑动的最大值

输入输出样例

输入样例#1:

8 3
1 3 -1 -3 5 3 6 7
输出样例#1:

-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)(区间最值)的更多相关文章

  1. 洛谷——P1886 滑动窗口|| POJ——T2823 Sliding Window

    https://www.luogu.org/problem/show?pid=1886#sub || http://poj.org/problem?id=2823 题目描述 现在有一堆数字共N个数字( ...

  2. [POJ2823][洛谷P1886]滑动窗口 Sliding Window

    题目大意:有一列数,和一个窗口,一次能框连续的s个数,初始时窗口在左端,不断往右移动,移到最右端为止,求每次被框住的s个数中的最小数和最大数. 解题思路:这道题是一道区间查询问题,可以用线段树做.每个 ...

  3. 洛谷 P1886 滑动窗口(单调队列)

    题目链接 https://www.luogu.org/problemnew/show/P1886 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始 ...

  4. 洛谷P1886滑动窗口

    题目传送门 理解题意:给定一个数列和窗口范围k,求依次向右移动窗口时每次窗口内的最大和最小值. 没什么思维难度,一边扫过去,用两个数组maxx和minn记录每个窗口内的最大最小值,移动过程中用两个变量 ...

  5. 洛谷 P1886 滑动窗口

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  6. [洛谷P1886]滑动窗口 (单调队列)(线段树)

    ---恢复内容开始--- 这是很好的一道题 题目描述: 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口. 现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的 ...

  7. 洛谷 P1886 滑动窗口 (数据与其他网站不同。。)

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  8. 洛谷 P1886 滑动窗口(单调队列)

    嗯... 题目链接:https://www.luogu.org/problem/P1886 首先这道题很典型,是标准的单调队列的模板题(也有人说单调队列只能解决这一个问题).这道题可以手写一个队列,也 ...

  9. 洛谷 P1886 滑动窗口 /【模板】单调队列

    纯板子题,入队时保证单调性,即单调栈,出队保证题目条件,本题即窗口长度k,在入队出队时都可以维护信息 ; int buf[maxm], maxq[maxm], minq[maxm], ans1[max ...

随机推荐

  1. 【逆向工具】IDA使用3-全局变量、数组、结构体

    全局变量 测试代码 全局变量既可以是某对象函数创建,也可以是在本程序任何地方创建.全局变量是可以被本程序所有对象或函数引用.下面这段代码中将int.float.char变量定义在main函数之外. / ...

  2. TCP建立流程 【转】

    解决TCP连接数过多的问题 TCP状态迁移,CLOSE_WAIT & FIN_WAIT2 的问题 TCP状态迁移 大家对netstat -a命令很熟悉,但是,你有没有注意到STATE一栏呢,基 ...

  3. Spring_使用XML文件的方式配置事务

    步骤: 正常配置jdbctemplate 正常配置bean 配置事物管理器 配置事物管理器 配置aop切入点,通过切入点把事物链接起来 思路: 接着上一个买书的例子吧,直接拷到新包下,把注解都干掉,需 ...

  4. 《java程序设计》结对编程-四则运算整体总结

    需求分析(描述自己对需求的理解,以及后续扩展的可能性) 实现一个命令行程序,要求: 自动生成小学四则运算题目(加,减,乘,除) 支持整数 支持多运算符(比如生成包含100个运算符的题目) 支持真分数 ...

  5. OCM_第十七天课程:Section7 —》GI 及 ASM 安装配置 _管理和配置 GRID /实施 ASM 故障组 /创建 ACFS 文件系统

    注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...

  6. 学习笔记(二)--->《Java 8编程官方参考教程(第9版).pdf》:第七章到九章学习笔记

    注:本文声明事项. 本博文整理者:刘军 本博文出自于: <Java8 编程官方参考教程>一书 声明:1:转载请标注出处.本文不得作为商业活动.若有违本之,则本人不负法律责任.违法者自负一切 ...

  7. NodeJs>------->>第三章:Node.js基础知识

    第三章:Node.js基础知识 一:Node.js中的控制台 1:console.log.console.info  方法 console.log(" node app1.js 1> ...

  8. CNN卷积核计算

    作者:十岁的小男孩 目录 单层卷积核计算 三维卷积核计算 Padding=Valid&&Same 总结

  9. 步步为营-69-Razor基础

    作用:进一步将HTML代码和C#代码进行解耦 1.1 引用程序集(RazorEngine.dll,System.Web.Razor.dll) 1.1.1 可以从http://razorengine.c ...

  10. Visual Studio强大的帮助工具--Resharper安装与使用

    ReSharper是一个JetBrains公司出品的代码生成工具,其能帮助Microsoft Visual Studio成为一个更佳的IDE.使用ReSharper,你可以进行深度代码分析,智能代码协 ...