首页 > TAG信息列表 > qmax
滑动窗口
1.解决的问题: 一个数组中,其左右边界都可以向右滑动,根据窗口的左右边界滑动更新该窗口内的最大值(时间复杂度为O(1)) 2.实现思路: 使用一个双端队列来维护:(处理的数据是数组的下标,而不是数本身) * 1.对于右边界向右滑动一格,如果新增进来的元素比双端队列的队尾元素小,则直接加入洛谷P2216 HAOI2007 理想的正方形 (单调队列)
题目就是要求在n*m的矩形中找出一个k*k的正方形(理想正方形),使得这个正方形内最值之差最小(就是要维护最大值和最小值),显然我们可以用单调队列维护。 但是二维平面上单调队列怎么用? 我们先对行处理,将其压缩为一个(n-k+1)*m的矩形;再对列进行处理,最终压缩为一个(n-k+1)*(m-k+1)的矩形,枚举最大滑动窗口
滑动窗口是一种想象出来的数据结构: 左边界l和右边界r l往右滑意味着一个样本出了窗口,r往右滑意味着一个样本进了窗口,l和r都只能往右滑 滑动内最大值和最小值的更新结构 窗口不管l还是r滑动之后,都会让窗口呈现新状况,如何能够更快的得到窗口当前状况下的最大值和最小值?最好平均下King of Range
原题链接 考察:双指针 思路: 两个单调队列,一个存最大值,一个存最小值.当差值\(>k\)时开始计数.这时需要在设置一个指针\(l\),将最左边的队列元素去掉.计算的时候....不要两头计算,确定左边计算右边........... Code #include <iostream> #include <cstring> using namespace第一章 栈和队列(生成窗口最大值数组)
题目: 有一个整型数组arr和一个大小为w的窗口从数组的最左边到最右边,窗口每次向右边滑一个位置,例如,数组为[4 3 5 4 3 3 6 7],窗口大小为3时。 [4 3 5] 4 3 3 6 7 输出5 4 [3 5 4 ]3 3 6 7 输出5 4 3 [5 4 3 ]3 6 7 输出5 4 3 5[ 4 3 3] 6 7 输出4 4 3 5 4[ 3 3 6子数组的取值范围-贪心算法
Description 给定数组arr和整数num,求arr的连续子数组中满足:其最大值减去最小值的结果大于num的个数。请实现一个时间复杂度为O(length(arr))的算法。 Input 输入第一行为测试用例个数。每一个用例有若干行,第一行为数组,每一个数用空格隔开,第二行为num。 Output 输出一个值。 Sample2021-02-27:假设一个固定大小为W的窗口,依次划过arr,返回每一次滑出状况的最大值。
2021-02-27:假设一个固定大小为W的窗口,依次划过arr,返回每一次滑出状况的最大值。例如,arr = [4,3,5,4,3,3,6,7], W = 3。返回:[5,5,5,4,6,7]。 福哥答案2021-02-27: 采用双端队列,存序号。遍历数组。1.当双端队列里没值或者双端队列最右边的值小于当前值,则把当前值的序号从右边push到队2021-02-27:假设一个固定大小为W的窗口,依次划过arr,返回每一次滑出状况的最大值。例如,arr = [4,3,5,4,3,3,6,7], W = 3。返回:[5,5,5,4,6,7]。
2021-02-27:假设一个固定大小为W的窗口,依次划过arr,返回每一次滑出状况的最大值。例如,arr = [4,3,5,4,3,3,6,7], W = 3。返回:[5,5,5,4,6,7]。 福哥答案2021-02-27: 采用双端队列,存序号。遍历数组。 1.当双端队列里没值或者双端队列最右边的值小于当前值,则把当前值的序号从右边push到随时找到数据流的中位数
随时找到数据流的中位数 题目描述 有一个源源不断的吐出整数的数据流,假设你有足够的空间来保存吐出的数。请设计一个名叫MedianHolder的结构,MedianHolder可以随时取得之前吐出所有数的中位数。 [要求] 如果MedianHolder已经保存了吐出的N个数,那么将一个新数加入到MedianHoldZJOI 2008 树的统计
ZJOI 2008 树的统计 洛谷传送门 JDOJ传送门 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v:树的统计
题目描述 原题来自:ZJOI 2008 一树上有 个节点,编号分别为 到 ,每个节点都有一个权值 。我们将以下面的形式来要求你对这棵树完成一些操作: CHANGE u t :把节点 权值改为 ; QMAX u v :询问点 到点 路径上的节点的最大权值; QSUM u v :询问点 到点 路径上的节点的权值和。 注意:从点 到点bzoj2402 陶陶的难题II 分数规划+树剖+线段树维护凸壳+二分
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=2402 题解 看上去很像分数规划的模型。于是就二分吧。令 \[ \begin{align*}\frac{y_i+q_j}{x_i+p_j} &\geq mid\\y_i+q_j &\geq mid(x_i+p_j)\\(y_i - mid\cdot x_i) + (q_j - mid\cdot p_j) & \geq 0\end{align*} \]BZOJ 4269: 再见Xor 线性基+贪心
Code: #include <bits/stdc++.h> #define ll long long #define M 33 #define setIO(s) freopen(s".in","r",stdin) using namespace std; int n,m; ll d[M*10]; void insert(ll x) { if(!x) return; for(int i=M;i>=0;--i) {树链剖分(超详细!!!)
一、轻重边剖分的过程 使用两次dfs来实现。剖分过程中要计算如下7个值: father[x]:x在树中的父亲 size[x]:x的子树结点数(子树大小) dep[x]:x在树中的深度 son[x]:x的重儿子,即为重边 top[x]:x所在重路径的顶部结点(深度最小) seg[x]:x在线段树中的位置(下标) rev[x]:线段树中第x个[ZJOI2008]树的统计
题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w。 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点牛客OJ:两个堆完成数据流中位数的查询
#include <bits/stdc++.h> using namespace std; priority_queue<int> qmax; // 多放一个 priority_queue<int, vector<int>, greater<int> > qmin; void Insert(int num) { if(qmax.empty()){ qmax.push(num); return ;洛谷试炼场 4-8单调队列
layout: post title: 洛谷试炼场 4-8单调队列 author: "luowentaoaa" catalog: true mathjax: true tags: - 单调队列 - 洛谷 [P2698 USACO12MAR]花盆Flowerpot (二分+单调队列) 题解 二分区间 做两个单调队列记录最大最小值,如果差大于D就OK #include<bits/stdc++.h> using names