【洛谷】【线段树】P1886 滑动窗口
【题目描述:】
现在有一堆数字共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 滑动窗口的更多相关文章
- 单调队列优化&&P1886 滑动窗口题解
单调队列: 顾名思义,就是队列中元素是单调的(单增或者单减). 在某些问题中能够优化复杂度. 在dp问题中,有一个专题动态规划的单调队列优化,以后会更新(现在还是太菜了不会). 在你看到类似于滑动定长 ...
- Luogu P1886 滑动窗口
P1886 滑动窗口 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The a ...
- P1886 滑动窗口(单调队列)
P1886 滑动窗口 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: ...
- P1886 滑动窗口&&P1440 求m区间内的最小值
声明:下面这两个题就不要暴力了,学一学单调队列吧 推荐博文:https://www.cnblogs.com/tham/p/8038828.html 单调队列入门题 P1440 求m区间内的最小值 题目 ...
- [洛谷P1886]滑动窗口 (单调队列)(线段树)
---恢复内容开始--- 这是很好的一道题 题目描述: 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口. 现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的 ...
- 洛谷P1886 滑动窗口(POJ.2823 Sliding Window)(区间最值)
To 洛谷.1886 滑动窗口 To POJ.2823 Sliding Window 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每 ...
- [POJ2823][洛谷P1886]滑动窗口 Sliding Window
题目大意:有一列数,和一个窗口,一次能框连续的s个数,初始时窗口在左端,不断往右移动,移到最右端为止,求每次被框住的s个数中的最小数和最大数. 解题思路:这道题是一道区间查询问题,可以用线段树做.每个 ...
- 洛谷 P1886 滑动窗口 (数据与其他网站不同。。)
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- 洛谷 P1886 滑动窗口(单调队列)
题目链接 https://www.luogu.org/problemnew/show/P1886 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始 ...
随机推荐
- static关键字的内存分析
通常情况下,Java把内存分为栈内存.堆内存和方法区 栈内存用来存放一些基本类型的变量和数组(数组也是一种引用类型)及对象的引用变量 堆内存主要是来放置对象的,即我们在程序中new出来的对象. sta ...
- tomcat服务器访问网址组成
运行tomcat服务器,其他设备访问的网址组成为: http://内网IP:端口/项目名字/网页名字.jsp
- 【基于初学者的SSH】struts02 数据封装的三种方式详解
struts的数据封装共有3中方式,属性封装,模型驱动封装和表达式封装,其中表达式封装为常用 一:属性封装: 属性封装其实就是自己定义变量,注意变量名要和表单的name属性名一致,然后生成get和se ...
- oracle数据库逐步学习总结【基础一】
原创作品,转载请在文章开头显眼位置注明出处:https://www.cnblogs.com/sunshine5683/p/10059955.html 一.oracle的基本命令 1.连接命令 用法:c ...
- 云服务器部署mongodb
我喜欢用简单的方法 步骤 下载 解压并运行 远程连接测试 下载 到官方下载页获取下载地址,如图 在云服务器上,使用命令curl 你的地址 -o mongodb.tgz ,下载到当前目录,转到下一步. ...
- python学习之老男孩python全栈第九期_数据库day002 -- 作业 (数据库为day001创建的数据库)
1.自行创建测试数据 对score表进行优化: 添加数据: 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 为了方便做题,额外增加几条数据 查询: 3.查询平均成绩大于60分的同学的学号和 ...
- front-end 前端发展学习路线参考图
front-end 前端发展学习路线参考图 学习的路程还很长~!
- 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 ...
- maven 依赖和坐标
1.maven 坐标由groupId.artifactId.packaging.version.classifier定义.2.classifier 用来帮助定义构建输出的一些附属构件.如,*javad ...
- 如何drop大表的中不用的字段 set unused column
转自 http://foxmile.blog.163.com/blog/static/81169805201143191957184/ 我 们要删除表中不用的字段,如果直接drop column,对于 ...