~~~题面~~~

题解:

  观察数据范围,这应该是一个复杂度O(n)的题。以最大值为例,考虑单调队列,维护一个单调递减的队列。从前向后扫,每次答案取队首,如果后面进入的比前面大,那么就弹出前面的数,因为是从前向后扫,所以后面进入的如果比前面的大,那么一定更优,因为要淘汰肯定先淘汰前面的。如果队首已经不在当前窗口内了,那么就弹出,直到合法为止。

  维护单调队列时的一个重要原则就是把别人“挤掉”的元素一定要比被挤掉的元素更优,否则可能找不到合法情况or漏掉最优解。注意这一点就很好理解了。

  最小值用求最大值相反的操作即可

  不知道为什么我以前写代码写那么丑,,,,重新写一份好了。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define R register int
  4. #define AC 1001000
  5.  
  6. int n, k, head, tail;
  7. int s[AC];
  8. struct node{
  9. int x, id;
  10. }q[AC];
  11.  
  12. inline int read()
  13. {
  14. int x = ;char c = getchar(); bool z = false;
  15. while(c > '' || c < '')
  16. {
  17. if(c == '-') z = true;
  18. c = getchar();
  19. }
  20. while(c >= '' && c <= '') x = x * + c - '', c = getchar();
  21. if(!z) return x;
  22. else return -x;
  23. }
  24.  
  25. void pre()
  26. {
  27. n = read(), k = read();
  28. for(R i = ; i <= n; i ++) s[i] = read();
  29. }
  30.  
  31. void work1()
  32. {
  33. head = , tail = ;
  34. for(R i = ; i <= n; i ++)
  35. {
  36. while(head <= tail && q[head].id <= i - k) ++ head;
  37. while(s[i] < q[tail].x && head <= tail) -- tail;//可以删完,反正后面要塞进来
  38. q[++tail] = (node){s[i], i};
  39. if(i >= k) printf("%d ", q[head].x);
  40. }
  41. printf("\n");
  42. }
  43.  
  44. void work2()
  45. {
  46. head = , tail = ;
  47. for(R i = ; i <= n; i ++)
  48. {
  49. while(head <= tail && q[head].id <= i - k) ++ head;//,,,前面也可以删完
  50. while(s[i] > q[tail].x && head <= tail) -- tail;//可以删完,反正后面要塞进来
  51. q[++tail] = (node){s[i], i};
  52. if(i >= k) printf("%d ", q[head].x);
  53. }
  54. printf("\n");
  55. }
  56.  
  57. int main()
  58. {
  59. freopen("in.in", "r", stdin);
  60. pre();
  61. work1();
  62. work2();
  63. fclose(stdin);
  64. return ;
  65. }

  当然如果你喜欢简短的代码,且不在意常数问题,你也可以这么写:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define R register int
  4. #define AC 1001000
  5.  
  6. int n, k, head, tail;
  7. int s[AC];
  8. struct node{ int x, id;} q[AC];
  9.  
  10. void cal(int t)
  11. {
  12. head = , tail = ;
  13. for(R i = ; i <= n; i ++)
  14. {
  15. while(head <= tail && q[head].id <= i - k) ++ head;
  16. while(s[i] < q[tail].x && head <= tail) -- tail;//可以删完,反正后面要塞进来
  17. q[++tail] = (node){s[i], i};
  18. if(i >= k) printf("%d ", q[head].x * t);
  19. }printf("\n");
  20. }
  21.  
  22. int main()
  23. {
  24. scanf("%d%d", &n, &k);
  25. for(R i = ; i <= n; i ++) scanf("%d", &s[i]);
  26. cal();
  27. for(R i = ; i <= n; i ++) s[i] = -s[i];
  28. cal(-);
  29. return ;
  30. }

[LG1886]滑动窗口 单调队列的更多相关文章

  1. luoguP1886 滑动窗口 [单调队列]

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

  2. [POJ2823]Sliding Window 滑动窗口(单调队列)

    题意 刚学单调队列的时候做过 现在重新做一次 一个很经典的题目 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗 ...

  3. POJ 2823 滑动窗口 单调队列

    https://vjudge.net/problem/POJ-2823 中文:https://loj.ac/problem/10175 题目 给一个长度为 $N$ 的数组,一个长为 $K$ 的滑动窗体 ...

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

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

  5. [Luogu P1886]滑动窗口--单调队列入门

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

  6. AcWing 154. 滑动窗口 单调队列

    地址 https://www.acwing.com/problem/content/description/156/ 输入格式 输入包含两行. 第一行包含两个整数n和k,分别代表数组长度和滑动窗口的长 ...

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

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

  8. cogs 495. 滑动窗口 单调队列

    495. 滑动窗口 ★★   输入文件:window.in   输出文件:window.out   简单对比时间限制:2 s   内存限制:256 MB [问题描述] 给你一个长度为N的数组,一个长为 ...

  9. POJ 2823 滑动窗口 单调队列模板

    我们从最简单的问题开始: 给定一个长度为N的整数数列a(i),i=0,1,...,N-1和窗长度k. 要求: f(i) = max{a(i-k+1),a(i-k+2),..., a(i)},i = 0 ...

随机推荐

  1. thinkphp-PHP实现pdf导出功能

    Thinkphp框架引用tcpdf插件,插件下载地址:待续... 代码编写前先引入tcpdf整个文件夹到项目目录的ThinkPHP文件夹下 如:/ThinkPHP/Library/Vendor/tcp ...

  2. python正则表达式+正则大量实例

    正则表达式 正则表达式内部函数详解http://www.runoob.com/python/python-reg-expressions.html 正则表达式是一个特殊的字符序列,它能帮助你方便的检查 ...

  3. Leecode刷题之旅-C语言/python-9.回文数

    /* * @lc app=leetcode.cn id=9 lang=c * * [9] 回文数 * * https://leetcode-cn.com/problems/palindrome-num ...

  4. 【JDBC】一、JDBC连接数据库

    package com.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLExce ...

  5. Go语言中的HTTP

    Go中的http使用 package main import ( "fmt" "net/http" "io/ioutil" "st ...

  6. ABAP CDS ON HANA-(11)ABAP CDSでの関連付け

    Association in ABAP CDS An association in CDS view joins different data sources. Defining and using ...

  7. 设置Git 记住密码

    设置记住密码(默认15分钟): git config --global credential.helper cache 如果想自己设置时间,可以这样做: git config credential.h ...

  8. 关于springboot 连接mysql 数据库报错问题

    springboot连接MySQL运行报错: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more ...

  9. 用Kettle的一套流程完成对整个数据库迁移 费元星

    原地址 :http://ainidehsj.iteye.com/blog/1735434 需求: 1.你是否遇到了需要将mysql数据库中的所有表与数据迁移到Oracle. 2.你是否还在使用kett ...

  10. error C2248: 'QObject::QObject' : cannot access private member declared in class 'QObject'

    1.error C2471: cannot update program database vc90.pdb 解决方案:https://blog.csdn.net/shuixin536/article ...