首页/新闻资讯/正文详情

y1,y2总复习笔记8 2026.7.22

发布时间:2026/9/22 20:07:06 来源:云帆数科 栏目:资讯中心
y1,y2总复习笔记8 2026.7.22
好吧今天没有最小生成树的prim一单调栈维护一个栈使栈内所有元素严格保持单调递增或单调递减实现过程初始化空栈栈中推荐存下标而非数值方便计算距离、边界循环遍历数组每一个下标 i while 栈不为空 且 当前元素破坏栈单调性 弹出栈顶元素 top 此时 栈顶的目标边界就是 i记录答案将当前下标 i 压入栈模板例题找每个数字左侧第一个更小的数字按照实现过程得到代码如下#includebits/stdc.h using namespace std; const int N1e55; stackint st; int a[N]; int main(){ int n; cinn; for(int i1;in;i){ cina[i]; } for(int i1;in;i){ while(!st.empty()a[st.top()]a[i]){ st.pop(); } if(st.empty()) cout-1 ; else couta[st.top()] ; st.push(i); } }真正的例题区间最小值问题给出正整数n和一个长度为n的数列要求找出一个子区间使这个子区间的数字之和乘上子区间中的最小值最大。我们的思路如下枚举区间左右端点搞贪心肯定不行1≤n≤10^5​​,0≤a[i]≤10^​6​​那我们的思路转移到最小值上枚举每一个点作为一个区间的最小值再反推求这个区间的左端点和右端点那区间端点怎么求呢一个数要想成为这个区间的最小值显然这个区间里不能再有比它小的数在它左边找第一个比它小的那这个第一个比它小的右边自然都比它大了在它右边找第一个比它小的那这个第一个比它小的左边自然都比它大了这样就得到了一个区间而找第一个比它小的数的过程我们考虑单调栈区间和直接采用前缀和代码如下long long 警告1-1警告#includebits/stdc.h using namespace std; const int N1e55; stackint st; int a[N],L[N],R[N],sum[N]; int main(){ int n; cinn; for(int i1;in;i){ cina[i]; sum[i]sum[i-1]a[i]; } for(int i1;in;i){ while(!st.empty()a[st.top()]a[i]){//留大的就是找左边第一个比自己小的 st.pop(); } if(st.empty()) L[i]0; else L[i]st.top(); st.push(i); } while(!st.empty()) st.pop(); for(int in;i1;i--){ while(!st.empty()a[st.top()]a[i]){ st.pop(); } if(st.empty()) R[i]n1; else R[i]st.top(); st.push(i); } int ans-1,l,r; for(int i1;in;i){ if(ans(sum[R[i]-1]-sum[L[i]])*a[i]){ ans(sum[R[i]-1]-sum[L[i]])*a[i]; lL[i]1; rR[i]-1; } } coutans\nl r; }本来想再放一个题但是都差不多其实就这样吧二单调队列队列内元素保持单调递增 / 单调递减的双端队列叫做单调队列求解问题定长滑动窗口最大值、最小值在这其中想要的元素在队头所以想要最小值从队头到队尾单调递增想要最小值从队头到队尾单调递减删除队头的情况队头太远不在所求范围内。删除队头无论如何要把a[i]插入队尾实现过程队尾维护单调性新元素 a[i] 入队前不断把队尾不如 a[i] 优的元素弹出。以单调递减求窗口最大值为例 若 a[i]≥a[q.back()]队尾元素可以永久删除。逻辑只要 i 还在窗口里队尾这个数永远不可能成为任何窗口的最大值没有保留价值。队头剔除过期元素窗口不断右移如果队头下标 q.front()≤i−k说明已经跑出窗口左边界弹出队头。维护单调的过程若要添加的元素小于队尾元素则不断末尾出队直至队尾元素小于要添加的元素。维护长度的过程若队列长度超过规定长度则队头出队。模板滑动窗口最大值for(int i1;in;i){ while(!q.empty() a[i] a[q.back()]){ q.pop_back(); } q.push_back(i); //注意存储下标 while(q.front() i - k){ q.pop_front(); } if(i k){ couta[q.front()] ; } }回顾一下二维前缀和的二次扫描法二维前缀和的二次扫描法 假设sum[i][j]a[i][j] for(int i1;in;i){ for(int j1;jn;j){ sum[i][j]sum[i][j-1]; } } for(int i1;in;i){ for(int j1;jn;j){ sum[i][j]sum[i-1][j]; } }第一层循环对每一行求一维前缀和x-------x-------x-------此时的sum[i][x]已经累加了该行前面的所有元素sum[i][j]只代表第 i 行前 j 个元素总和还不是二维前缀和。第二层循环对每一列求一维前缀和现在sum[i][j]本身已经是第 i 行横向前缀和 再纵向累加上面一行同列的值。就得到了二维前缀和注意查询x1,y2)(x2,y2)子矩形anssum[x2​][y2​]−sum[x1​−1][y2​]−sum[x2​][y1​−1]sum[x1​−1][y1​−1]例题来了理想的正方形有一个n×m的整数组成的矩阵现请你从中找出一个k×k的正方形区域使得该区域所有数中的最大值和最小值的差最小。与我们的二次扫描前缀和同源先对每一行用单调队列求出每行内、长度为 k 的滑动窗口最大值、最小值 得到两个新矩阵row_max[i][j]、row_min[i][j]第 i 行区间的最大值。再对row_max的每一列做单调队列窗口大小 k 得到sq_max[x][y]左上角对应 (x-k1,y-k1) 的正方形最大值。同理对row_min每一列单调队列得到每个正方形最小值sq_min[x][y]。遍历所有正方形求。思路大概是这样的代码如下#includebits/stdc.h #define ll long long const int N1e35; using namespace std; int n,m,k,a[N][N],r_max[N][N],r_min[N][N],ans0x7fffffff; dequeint Max,Min; int main(){ scanf(%d%d%d,n,m,k); for(int i1;in;i){ for(int j1;jm;j){ scanf(%d,a[i][j]); } } for(int i1;in;i){ for(int j1;jm;j){ while(!Max.empty()Max.front()kj){ Max.pop_front(); } while(!Max.empty()a[i][Max.back()]a[i][j]){ Max.pop_back(); } Max.push_back(j); while(!Min.empty()Min.front()kj){ Min.pop_front(); } while(!Min.empty()a[i][Min.back()]a[i][j]){ Min.pop_back(); } Min.push_back(j); if(jk){ r_min[i][j]a[i][Min.front()]; r_max[i][j]a[i][Max.front()]; } } while(!Max.empty()) Max.pop_front(); while(!Min.empty()) Min.pop_front(); } for(int jk;jm;j){ for(int i1;in;i){ while(!Max.empty()Max.front()ki){ Max.pop_front(); } while(!Max.empty()r_max[Max.back()][j]r_max[i][j]){ Max.pop_back(); } Max.push_back(i); while(!Min.empty()Min.front()ki){ Min.pop_front(); } while(!Min.empty()r_min[Min.back()][j]r_min[i][j]){ Min.pop_back(); } Min.push_back(i); if(ik){ ansmin(ans,r_max[Max.front()][j]-r_min[Min.front()][j]); } } while(!Max.empty()) Max.pop_front(); while(!Min.empty()) Min.pop_front(); } coutans; }

相关推荐

什么是“利旧“?以魅视边缘计算为例
什么是“利旧“?以魅视边缘计算为例

一、什么是"利旧"? "利旧"这个词在安防和信息化行业并不新鲜,但在AI改造浪潮中被赋予了新的含义。 传统意义上的利旧,指的是在系统升级或改造时,保留原有设备继续使用,不替换、不报废。比如机房改… · 2026/7/29 15:56:58

#define 和 const 的区别
#define 和 const 的区别

#define 和 const 的区别 #define和const都可以用来表示常量,但机制有所不同。 1. 本质不同#define是预处理宏,在编译前做文本替换const是 C 语言里的常量,有类型,受编译器语义检查2. 是否有类型#define没有类型信息const有明确类… · 2026/9/17 12:38:26

springboot社区垃圾分类系统微信小程序
springboot社区垃圾分类系统微信小程序

背景近年来,随着城市化进程的加速和居民生活水平的提高,生活垃圾产量持续攀升,传统垃圾分类和处理方式已难以满足环保需求。垃圾分类作为城市治理的重要环节,直接关系到资源回收利用率、生态环境保护和可持续发展目标的实现。然而… · 2026/9/21 14:13:33

cpu和显卡怎么搭配从入门到实战
cpu和显卡怎么搭配从入门到实战

3步搞定CPU显卡搭配,保姆级教程助面试官闭嘴 面试被问原理答不上来,那种尴尬像极了裸奔。别慌,这篇 保姆级教程 带你从底层逻辑拆解CPU和显卡的匹配关系,让你下次面试自信反问。 一句话原理:木桶效应与总线瓶颈… · 2026/9/22 20:06:41

3步搞定飞机素材手写实现,拒绝文档迷路
3步搞定飞机素材手写实现,拒绝文档迷路

3步搞定飞机素材手写实现,拒绝文档迷路 官方文档翻了三遍还是晕?别急,直接上手手写实现。 一句话原理 飞机素材本质是位图数据与变换矩阵的结合体。 类比解释 把飞机素材想象成乐高积木的包装。 你不需要拆开每一个塑料颗粒(像素)。… · 2026/9/22 20:06:29

3步搞定pdf办公软件,一文搞懂报错Stacktrace
3步搞定pdf办公软件,一文搞懂报错Stacktrace

3步搞定pdf办公软件,一文搞懂报错Stacktrace 盯着屏幕上那串红色的 java.lang.NullPointerException 或者 java.io.IOException… · 2026/9/22 20:06:23

自荐书格式新手避坑指南,3个高频考点一次讲透
自荐书格式新手避坑指南,3个高频考点一次讲透

自荐书格式新手避坑指南,3个高频考点一次讲透 刚拿到Offer,HR突然甩来一句“把自荐书发我”,你脑子瞬间一片空白。别慌,这玩意儿在技术圈常被误解成“个人简历的复制粘贴”,结果配置半天环境,连个像样的文档都交不出来。今天咱们不整虚的,直接… · 2026/9/22 20:06:16

刃影升级攻略:搞定高频面试题的底层逻辑,告别配置环境卡半天
刃影升级攻略:搞定高频面试题的底层逻辑,告别配置环境卡半天

刃影升级攻略:搞定高频面试题的底层逻辑,告别配置环境卡半天 配置环境就卡半天?别急,这不只是网络问题,更是你对底层原理理解的缺失。很多应届生在准备 高频面试题… · 2026/9/22 20:06:10

3个高频面试题拆解推荐算法工程师真实工作流
3个高频面试题拆解推荐算法工程师真实工作流

3个高频面试题拆解推荐算法工程师真实工作流 刚把那段从网上抄来的协同过滤代码跑起来,结果控制台直接抛出一个 KeyError… · 2026/9/22 20:06:10

5个电影海报图片处理坑,新手避坑指南
5个电影海报图片处理坑,新手避坑指南

5个电影海报图片处理坑,新手避坑指南 刚写完代码,一运行屏幕直接炸了。满屏红色的 StackTrace 滚得比弹幕还快,什么 NullPointerException 、 ImageIO.read() returned null 、… · 2026/9/22 0:00:07

注册微信公众账号:一文搞懂从0到1全流程
注册微信公众账号:一文搞懂从0到1全流程

注册微信公众账号:一文搞懂从0到1全流程 复制来的代码跑不通,报错信息满屏飞,到底卡在哪?别急,咱们先停下手里的调试。很多开发者觉得注册微信公众账号只是填个表单、传个身份证那么简单,真上手才发现坑深不见底。今天这篇 一文搞懂… · 2026/9/22 0:00:07

手写实现图片压缩网站核心:搞定WebP转换与质量调优
手写实现图片压缩网站核心:搞定WebP转换与质量调优

手写实现图片压缩网站核心:搞定WebP转换与质量调优 复制来的代码跑不通不知道怎么调?别慌,这种“复制粘贴地狱”在开发圈太常见了。尤其是做 图片压缩网站… · 2026/9/22 0:00:19

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码