单调队列(专项复习)

2024-09-06 04:52
文章标签 队列 复习 单调 专项

本文主要是介绍单调队列(专项复习),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

P1886 滑动窗口 /【模板】单调队列

 

 题目思路:单调队列模版题,每次都输出队列中的第一个元素。以此维护队列中元素序号的单调性,得到结果。只是比较判断,时间复杂度很小。相等的值也要挤掉。最大值同理。

代码实现:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 3000005
ll dp[N], f1[N], f2[N];
ll a[N], b[N], c[N];
bool vis[N], flag;
ll x, y, z, n, m, t, k;
ll ans, sum, cnt;
deque<ll>q;
int main() 
{cin >> n >> m;for (int i = 1; i <= n; i++) {cin >> a[i];}for (int i = 1; i <= n; i++) {while (!q.empty() && a[q.back()] >= a[i]) q.pop_back();q.push_back(i);if (i >= m) {while (q.front() <= i - m) q.pop_front();cout << a[q.front()] << " ";}}cout << endl;q.clear();for (int i = 1; i <= n; i++) {while (!q.empty() && a[q.back()] <= a[i]) q.pop_back();q.push_back(i);if (i >= m) {while (q.front() <= i - m) q.pop_front();cout << a[q.front()] << " ";}}return 0;
}

P1901 发射站

题目思路: 用一个线性算法,先从左往右推。若在栈中栈顶那个塔的高度比当前塔的高度低,即此塔为栈顶塔右边的第一个比栈顶塔高的塔,那么栈顶塔的能量就要加给当前塔,然后将队列顶塔出栈。直到队列内无塔或下一塔比它的高度高,就将该塔进队列,并指向下一个塔。反之亦然。两趟之间要清空栈,最后再打个擂台,找MAX。

代码实现:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 3000005
ll dp[N], f1[N], f2[N];
ll a[N], b[N], c[N];
bool vis[N], flag;
ll x, y, z, n, m, t, k;
ll ans, sum, cnt;
deque<ll>q;
struct node {ll x, y, z;
}f[N];
int main()
{cin >> n;for (int i = 1; i <= n; i++)cin >> f[i].x >> f[i].y;for (int i = 1; i <= n; i++) {while (!q.empty() && f[q.back()].x < f[i].x) {f[i].z += f[q.back()].y;q.pop_back();}if (!q.empty()) {f[q.back()].z += f[i].y;}q.push_back(i);}for (int i = 1; i <= n; i++)ans = max(ans, f[i].z);cout << ans << endl;return 0;
}

P1419 寻找段落

题目思路:

首先看出答案满足单调性,可以二分答案,转化为判定性问题。令最优平均值为k,对于所有合法序列[l..r],尝试将分式变为整式:s[l..r]>k*(r-l+1)无解。移项,令b[i]=a[i]-k,s’[i]为b[1]..b[n]的和,则有寻找长度在[s,t]内的子段和的最大值可以用单调队列解决

代码实现:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 3000005
ll dp[N], f1[N], f2[N], a[N];
double b[N], c[N];
bool vis[N], flag;
ll x, y, z, n, m, t, k;
ll sum, cnt;
double l, r, mid, ans;
deque<ll>q;bool check(double k) {q.clear();for (int i = 1; i <= n; i++)c[i] = (double)a[i] - k;for (int i = 1; i <= n; i++) {b[i] = b[i - 1] + c[i];}for (int i = 1; i <= n; i++) {if (i >= x) {while (!q.empty() && b[q.back()] > b[i - x]) q.pop_back();q.push_back(i - x);}if (!q.empty() && i - y > q.front()) q.pop_front();if (!q.empty() && b[i] - b[q.front()] >= 0) return true;}return false;
}
int main()
{cin >> n >> x >> y;for (int i = 1; i <= n; i++)cin >> a[i];l = -10000; r = 10000;while (r - l > 1e-5) {mid = (l + r) /2;if (check(mid))ans = l = mid;elser = mid;}printf("%.3lf\n", ans);return 0;
}

这篇关于单调队列(专项复习)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1141049

相关文章

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

Java并发编程之——BlockingQueue(队列)

一、什么是BlockingQueue BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种: 1. 当队列满了的时候进行入队列操作2. 当队列空了的时候进行出队列操作123 因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空

【408数据结构】散列 (哈希)知识点集合复习考点题目

苏泽  “弃工从研”的路上很孤独,于是我记下了些许笔记相伴,希望能够帮助到大家    知识点 1. 散列查找 散列查找是一种高效的查找方法,它通过散列函数将关键字映射到数组的一个位置,从而实现快速查找。这种方法的时间复杂度平均为(

FreeRTOS学习笔记(六)队列

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、队列的基本内容1.1 队列的引入1.2 FreeRTOS 队列的功能与作用1.3 队列的结构体1.4 队列的使用流程 二、相关API详解2.1 xQueueCreate2.2 xQueueSend2.3 xQueueReceive2.4 xQueueSendFromISR2.5 xQueueRecei

多线程篇(阻塞队列- LinkedBlockingDeque)(持续更新迭代)

目录 一、LinkedBlockingDeque是什么 二、核心属性详解 三、核心方法详解 addFirst(E e) offerFirst(E e) putFirst(E e) removeFirst() pollFirst() takeFirst() 其他 四、总结 一、LinkedBlockingDeque是什么 首先queue是一种数据结构,一个集合中