[LG1886]滑动窗口 单调队列
题解:
观察数据范围,这应该是一个复杂度O(n)的题。以最大值为例,考虑单调队列,维护一个单调递减的队列。从前向后扫,每次答案取队首,如果后面进入的比前面大,那么就弹出前面的数,因为是从前向后扫,所以后面进入的如果比前面的大,那么一定更优,因为要淘汰肯定先淘汰前面的。如果队首已经不在当前窗口内了,那么就弹出,直到合法为止。
维护单调队列时的一个重要原则就是把别人“挤掉”的元素一定要比被挤掉的元素更优,否则可能找不到合法情况or漏掉最优解。注意这一点就很好理解了。
最小值用求最大值相反的操作即可
不知道为什么我以前写代码写那么丑,,,,重新写一份好了。
- #include<bits/stdc++.h>
- using namespace std;
- #define R register int
- #define AC 1001000
- int n, k, head, tail;
- int s[AC];
- struct node{
- int x, id;
- }q[AC];
- inline int read()
- {
- int x = ;char c = getchar(); bool z = false;
- while(c > '' || c < '')
- {
- if(c == '-') z = true;
- c = getchar();
- }
- while(c >= '' && c <= '') x = x * + c - '', c = getchar();
- if(!z) return x;
- else return -x;
- }
- void pre()
- {
- n = read(), k = read();
- for(R i = ; i <= n; i ++) s[i] = read();
- }
- void work1()
- {
- head = , tail = ;
- for(R i = ; i <= n; i ++)
- {
- while(head <= tail && q[head].id <= i - k) ++ head;
- while(s[i] < q[tail].x && head <= tail) -- tail;//可以删完,反正后面要塞进来
- q[++tail] = (node){s[i], i};
- if(i >= k) printf("%d ", q[head].x);
- }
- printf("\n");
- }
- void work2()
- {
- head = , tail = ;
- for(R i = ; i <= n; i ++)
- {
- while(head <= tail && q[head].id <= i - k) ++ head;//,,,前面也可以删完
- while(s[i] > q[tail].x && head <= tail) -- tail;//可以删完,反正后面要塞进来
- q[++tail] = (node){s[i], i};
- if(i >= k) printf("%d ", q[head].x);
- }
- printf("\n");
- }
- int main()
- {
- freopen("in.in", "r", stdin);
- pre();
- work1();
- work2();
- fclose(stdin);
- return ;
- }
当然如果你喜欢简短的代码,且不在意常数问题,你也可以这么写:
- #include<bits/stdc++.h>
- using namespace std;
- #define R register int
- #define AC 1001000
- int n, k, head, tail;
- int s[AC];
- struct node{ int x, id;} q[AC];
- void cal(int t)
- {
- head = , tail = ;
- for(R i = ; i <= n; i ++)
- {
- while(head <= tail && q[head].id <= i - k) ++ head;
- while(s[i] < q[tail].x && head <= tail) -- tail;//可以删完,反正后面要塞进来
- q[++tail] = (node){s[i], i};
- if(i >= k) printf("%d ", q[head].x * t);
- }printf("\n");
- }
- int main()
- {
- scanf("%d%d", &n, &k);
- for(R i = ; i <= n; i ++) scanf("%d", &s[i]);
- cal();
- for(R i = ; i <= n; i ++) s[i] = -s[i];
- cal(-);
- return ;
- }
[LG1886]滑动窗口 单调队列的更多相关文章
- luoguP1886 滑动窗口 [单调队列]
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- [POJ2823]Sliding Window 滑动窗口(单调队列)
题意 刚学单调队列的时候做过 现在重新做一次 一个很经典的题目 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗 ...
- POJ 2823 滑动窗口 单调队列
https://vjudge.net/problem/POJ-2823 中文:https://loj.ac/problem/10175 题目 给一个长度为 $N$ 的数组,一个长为 $K$ 的滑动窗体 ...
- [洛谷P1886]滑动窗口 (单调队列)(线段树)
---恢复内容开始--- 这是很好的一道题 题目描述: 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口. 现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的 ...
- [Luogu P1886]滑动窗口--单调队列入门
题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...
- AcWing 154. 滑动窗口 单调队列
地址 https://www.acwing.com/problem/content/description/156/ 输入格式 输入包含两行. 第一行包含两个整数n和k,分别代表数组长度和滑动窗口的长 ...
- 洛谷 P1886 滑动窗口(单调队列)
题目链接 https://www.luogu.org/problemnew/show/P1886 题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始 ...
- cogs 495. 滑动窗口 单调队列
495. 滑动窗口 ★★ 输入文件:window.in 输出文件:window.out 简单对比时间限制:2 s 内存限制:256 MB [问题描述] 给你一个长度为N的数组,一个长为 ...
- 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 ...
随机推荐
- thinkphp-PHP实现pdf导出功能
Thinkphp框架引用tcpdf插件,插件下载地址:待续... 代码编写前先引入tcpdf整个文件夹到项目目录的ThinkPHP文件夹下 如:/ThinkPHP/Library/Vendor/tcp ...
- python正则表达式+正则大量实例
正则表达式 正则表达式内部函数详解http://www.runoob.com/python/python-reg-expressions.html 正则表达式是一个特殊的字符序列,它能帮助你方便的检查 ...
- Leecode刷题之旅-C语言/python-9.回文数
/* * @lc app=leetcode.cn id=9 lang=c * * [9] 回文数 * * https://leetcode-cn.com/problems/palindrome-num ...
- 【JDBC】一、JDBC连接数据库
package com.jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLExce ...
- Go语言中的HTTP
Go中的http使用 package main import ( "fmt" "net/http" "io/ioutil" "st ...
- ABAP CDS ON HANA-(11)ABAP CDSでの関連付け
Association in ABAP CDS An association in CDS view joins different data sources. Defining and using ...
- 设置Git 记住密码
设置记住密码(默认15分钟): git config --global credential.helper cache 如果想自己设置时间,可以这样做: git config credential.h ...
- 关于springboot 连接mysql 数据库报错问题
springboot连接MySQL运行报错: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more ...
- 用Kettle的一套流程完成对整个数据库迁移 费元星
原地址 :http://ainidehsj.iteye.com/blog/1735434 需求: 1.你是否遇到了需要将mysql数据库中的所有表与数据迁移到Oracle. 2.你是否还在使用kett ...
- 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 ...