【洛谷】【线段树】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的窗口.现在这个从左边开始 ...
随机推荐
- BZOJ3832: [Poi2014]Rally(拓扑排序 堆)
题意 题目链接 Sol 最直观的思路是求出删除每个点后的最长路,我们考虑这玩意儿怎么求 设\(f[i]\)表示以\(i\)结尾的最长路长度,\(g[i]\)表示以\(i\)开始的最长路长度 根据DAG ...
- Mysql 删除数据表的三种方式详解
用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, 用 delete. 删除强度:dro ...
- 什么是URI,URL以及URN,你真的理解了吗。
先举一个例子,让大家对这三个名词又一个基本的概念: 1⃣️ ftp://ftp.is.co.za/rfc/rfc1808.txt 2⃣️ http://www.cnblogs.com/nods/p/8 ...
- linux 命令格式、ls命令、du命令
命令格式:命令 [-选项] [参数] ls -la /etc1.个别命令不遵循此格式2.当有多个选项时,可以写在一起,大多数顺序可以随意3.简化选项与完整选项 -a 等于 --all ls命令:ls ...
- B/S与C/S架构、B/S架构协议
软件有三大类型 单机类型.CS类型(Outlook.QQ.大型游戏).BS类型 BS结构中的协议 在BS结构中,首先使用到DNS协议:网络传输部分使用TCP/IP参考模型,其中网络接入层没有相应协议, ...
- Pig join用法举例
jnd = join a by f1, b by f2; join操作默认的是内连接,只有两边都匹配才会保留 需要用null补位的那边需要知道它的模式: 如果是左外连接,需要知道右边的数据集的 ...
- Week6——Lifecycle of JSF and Facelets
一.JSF生命周期 JSF是基于事件驱动.JSF生命周期分为两个主要阶段:执行阶段和渲染阶段. 1.执行阶段 分为六个阶段: 恢复视图阶段 当客户端请求一个JavaServer Faces页面时,Ja ...
- zabbix系列之八——安装后配置三Triggers
1Triggers(触发器) 描述 详细 备注 术语描述 1)触发器是评估监控项采集的数据的逻辑表达式,代表了当前系统状态. 2)触发器可定义一个什么数据是可接受的阈值,因此,如果接收的数据超过了可接 ...
- 4.Servlet过滤器
1.Servlet 编写过滤器 Servlet 过滤器是可用于 Servlet 编程的 Java 类,有以下目的: 在客户端的请求访问后端资源之前,拦截这些请求. 在服务器的响应发送回客户端之前,处理 ...
- Oracle EBS AR 客户取数SQL
SELECT acct.cust_account_id, acct.party_id, acct.account_number, party.party_name, lkp1.meaning part ...