【题目描述:】

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

【输入格式:】

输入一共有两行,第一行为n,k。

第二行为n个数(<INT_MAX).

【输出格式:】

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

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

输入样例#: 

  - -    

输出样例#:
- - - -

输入输出样例

【算法分析:】 

线段树使用结构体同时维护区间最小值和最大值

没有修改只有建树和查询操作,更优的方法是使用st表做RMQ

板子题.

【代码:】

 //滑动窗口
#include<iostream>
#include<cstdio>
using namespace std; const int MAXN = 1e6 + ; int n, k;
int a[MAXN];
struct Segment {
int maxn, minn;
}t[MAXN << ]; void Build(int o, int l, int r) {
if(l == r) t[o].maxn = t[o].minn = a[l];
else {
int mid = (l + r) >> ;
Build(o << , l , mid);
Build(o << |, mid + , r);
t[o].maxn = max(t[o << ].maxn, t[o << |].maxn);
t[o].minn = min(t[o << ].minn, t[o << |].minn);
}
}
int max_ans, min_ans;
void Query(int o, int l, int r, int ql, int qr) {
if(ql <= l && r <= qr) {
max_ans = max(max_ans, t[o].maxn);
min_ans = min(min_ans, t[o].minn);
}
else {
int mid = (l + r) >> ;
if(ql <= mid) Query(o << , l, mid, ql, qr);
if(qr > mid) Query(o << |, mid + , r, ql, qr);
}
} int ans1[MAXN], ans2[MAXN];
int main() {
scanf("%d%d", &n, &k);
for(int i = ; i <= n; ++i)
scanf("%d", &a[i]);
Build(, , n);
for(int i = ; i + k - <= n; ++i) {
max_ans = -2e9, min_ans = 2e9;
Query(, , n, i, i + k - );
ans1[i] = max_ans, ans2[i] = min_ans;
}
for(int i = ; i <= n - k + ; ++i) printf("%d ", ans2[i]);
putchar('\n');
for(int i = ; i <= n - k + ; ++i) printf("%d ", ans1[i]);
}

【洛谷】【线段树】P1886 滑动窗口的更多相关文章

  1. 单调队列优化&&P1886 滑动窗口题解

    单调队列: 顾名思义,就是队列中元素是单调的(单增或者单减). 在某些问题中能够优化复杂度. 在dp问题中,有一个专题动态规划的单调队列优化,以后会更新(现在还是太菜了不会). 在你看到类似于滑动定长 ...

  2. Luogu P1886 滑动窗口

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

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

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

  4. P1886 滑动窗口&&P1440 求m区间内的最小值

    声明:下面这两个题就不要暴力了,学一学单调队列吧 推荐博文:https://www.cnblogs.com/tham/p/8038828.html 单调队列入门题 P1440 求m区间内的最小值 题目 ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. static关键字的内存分析

    通常情况下,Java把内存分为栈内存.堆内存和方法区 栈内存用来存放一些基本类型的变量和数组(数组也是一种引用类型)及对象的引用变量 堆内存主要是来放置对象的,即我们在程序中new出来的对象. sta ...

  2. tomcat服务器访问网址组成

    运行tomcat服务器,其他设备访问的网址组成为: http://内网IP:端口/项目名字/网页名字.jsp

  3. 【基于初学者的SSH】struts02 数据封装的三种方式详解

    struts的数据封装共有3中方式,属性封装,模型驱动封装和表达式封装,其中表达式封装为常用 一:属性封装: 属性封装其实就是自己定义变量,注意变量名要和表单的name属性名一致,然后生成get和se ...

  4. oracle数据库逐步学习总结【基础一】

    原创作品,转载请在文章开头显眼位置注明出处:https://www.cnblogs.com/sunshine5683/p/10059955.html 一.oracle的基本命令 1.连接命令 用法:c ...

  5. 云服务器部署mongodb

    我喜欢用简单的方法 步骤 下载 解压并运行 远程连接测试 下载 到官方下载页获取下载地址,如图 在云服务器上,使用命令curl 你的地址 -o mongodb.tgz ,下载到当前目录,转到下一步. ...

  6. python学习之老男孩python全栈第九期_数据库day002 -- 作业 (数据库为day001创建的数据库)

    1.自行创建测试数据 对score表进行优化: 添加数据: 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 为了方便做题,额外增加几条数据 查询: 3.查询平均成绩大于60分的同学的学号和 ...

  7. front-end 前端发展学习路线参考图

    front-end 前端发展学习路线参考图 学习的路程还很长~!

  8. Error no matching function for call to 'std::exception::exception(const char [15])'

    Error no matching function for call to 'std::exception::exception(const char [15])' Error 'logic_err ...

  9. maven 依赖和坐标

    1.maven 坐标由groupId.artifactId.packaging.version.classifier定义.2.classifier 用来帮助定义构建输出的一些附属构件.如,*javad ...

  10. 如何drop大表的中不用的字段 set unused column

    转自 http://foxmile.blog.163.com/blog/static/81169805201143191957184/ 我 们要删除表中不用的字段,如果直接drop column,对于 ...