【题目描述:】

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

【输入格式:】

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

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

【输出格式:】

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

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

  1. 输入样例#:
  2.  
  3. - -
  4.  
  5. 输出样例#:
  6. - - - -

输入输出样例

【算法分析:】 

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

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

板子题.

【代码:】

  1. //滑动窗口
  2. #include<iostream>
  3. #include<cstdio>
  4. using namespace std;
  5.  
  6. const int MAXN = 1e6 + ;
  7.  
  8. int n, k;
  9. int a[MAXN];
  10. struct Segment {
  11. int maxn, minn;
  12. }t[MAXN << ];
  13.  
  14. void Build(int o, int l, int r) {
  15. if(l == r) t[o].maxn = t[o].minn = a[l];
  16. else {
  17. int mid = (l + r) >> ;
  18. Build(o << , l , mid);
  19. Build(o << |, mid + , r);
  20. t[o].maxn = max(t[o << ].maxn, t[o << |].maxn);
  21. t[o].minn = min(t[o << ].minn, t[o << |].minn);
  22. }
  23. }
  24. int max_ans, min_ans;
  25. void Query(int o, int l, int r, int ql, int qr) {
  26. if(ql <= l && r <= qr) {
  27. max_ans = max(max_ans, t[o].maxn);
  28. min_ans = min(min_ans, t[o].minn);
  29. }
  30. else {
  31. int mid = (l + r) >> ;
  32. if(ql <= mid) Query(o << , l, mid, ql, qr);
  33. if(qr > mid) Query(o << |, mid + , r, ql, qr);
  34. }
  35. }
  36.  
  37. int ans1[MAXN], ans2[MAXN];
  38. int main() {
  39. scanf("%d%d", &n, &k);
  40. for(int i = ; i <= n; ++i)
  41. scanf("%d", &a[i]);
  42. Build(, , n);
  43. for(int i = ; i + k - <= n; ++i) {
  44. max_ans = -2e9, min_ans = 2e9;
  45. Query(, , n, i, i + k - );
  46. ans1[i] = max_ans, ans2[i] = min_ans;
  47. }
  48. for(int i = ; i <= n - k + ; ++i) printf("%d ", ans2[i]);
  49. putchar('\n');
  50. for(int i = ; i <= n - k + ; ++i) printf("%d ", ans1[i]);
  51. }

【洛谷】【线段树】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. BZOJ3832: [Poi2014]Rally(拓扑排序 堆)

    题意 题目链接 Sol 最直观的思路是求出删除每个点后的最长路,我们考虑这玩意儿怎么求 设\(f[i]\)表示以\(i\)结尾的最长路长度,\(g[i]\)表示以\(i\)开始的最长路长度 根据DAG ...

  2. Mysql 删除数据表的三种方式详解

    用法: 1.当你不再需要该表时, 用 drop; 2.当你仍要保留该表,但要删除所有记录时, 用 truncate; 3.当你要删除部分记录或者有可能会后悔的话, 用 delete. 删除强度:dro ...

  3. 什么是URI,URL以及URN,你真的理解了吗。

    先举一个例子,让大家对这三个名词又一个基本的概念: 1⃣️ ftp://ftp.is.co.za/rfc/rfc1808.txt 2⃣️ http://www.cnblogs.com/nods/p/8 ...

  4. linux 命令格式、ls命令、du命令

    命令格式:命令 [-选项] [参数] ls -la /etc1.个别命令不遵循此格式2.当有多个选项时,可以写在一起,大多数顺序可以随意3.简化选项与完整选项 -a 等于 --all ls命令:ls ...

  5. B/S与C/S架构、B/S架构协议

    软件有三大类型 单机类型.CS类型(Outlook.QQ.大型游戏).BS类型 BS结构中的协议 在BS结构中,首先使用到DNS协议:网络传输部分使用TCP/IP参考模型,其中网络接入层没有相应协议, ...

  6. Pig join用法举例

    jnd = join a by f1, b by f2;   join操作默认的是内连接,只有两边都匹配才会保留   需要用null补位的那边需要知道它的模式: 如果是左外连接,需要知道右边的数据集的 ...

  7. Week6——Lifecycle of JSF and Facelets

    一.JSF生命周期 JSF是基于事件驱动.JSF生命周期分为两个主要阶段:执行阶段和渲染阶段. 1.执行阶段 分为六个阶段: 恢复视图阶段 当客户端请求一个JavaServer Faces页面时,Ja ...

  8. zabbix系列之八——安装后配置三Triggers

    1Triggers(触发器) 描述 详细 备注 术语描述 1)触发器是评估监控项采集的数据的逻辑表达式,代表了当前系统状态. 2)触发器可定义一个什么数据是可接受的阈值,因此,如果接收的数据超过了可接 ...

  9. 4.Servlet过滤器

    1.Servlet 编写过滤器 Servlet 过滤器是可用于 Servlet 编程的 Java 类,有以下目的: 在客户端的请求访问后端资源之前,拦截这些请求. 在服务器的响应发送回客户端之前,处理 ...

  10. Oracle EBS AR 客户取数SQL

    SELECT acct.cust_account_id, acct.party_id, acct.account_number, party.party_name, lkp1.meaning part ...