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/24 19:01:43 阅读更多 →
AMD锐龙SDT调试工具:解锁Ryzen处理器隐藏性能的终极指南

AMD锐龙SDT调试工具:解锁Ryzen处理器隐藏性能的终极指南

AMD锐龙SDT调试工具:解锁Ryzen处理器隐藏性能的终极指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://…

2026/7/24 19:00:43 阅读更多 →
Free LLM Balancer:本地与云端智能负载均衡开源方案

Free LLM Balancer:本地与云端智能负载均衡开源方案

Free LLM Balancer:整合本地推理与云端备援的智能负载均衡方案 在实际的LLM应用开发中,我们经常面临一个核心矛盾:本地部署虽然成本可控且数据安全,但受限于硬件资源;云端服务虽然性能强大,但长期使用成本高…

2026/7/24 19:00:43 阅读更多 →

最新新闻

零基础AI换脸神器:roop-unleashed终极快速入门指南

零基础AI换脸神器:roop-unleashed终极快速入门指南

零基础AI换脸神器:roop-unleashed终极快速入门指南 【免费下载链接】roop-unleashed Evolved Fork of roop with Web Server and lots of additions 项目地址: https://gitcode.com/gh_mirrors/ro/roop-unleashed 想要体验电影级别的面部替换特效&#xff0c…

2026/7/24 19:09:44 阅读更多 →
Chrome滚动截图神器:一键保存完整网页的终极解决方案

Chrome滚动截图神器:一键保存完整网页的终极解决方案

Chrome滚动截图神器:一键保存完整网页的终极解决方案 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-extens…

2026/7/24 19:09:44 阅读更多 →
从零散文件到标准化管理:高效文件命名与批量处理实践

从零散文件到标准化管理:高效文件命名与批量处理实践

1. 先搞清楚这个标题到底在说什么“一点都不乖《Lion Heart》0706”这个标题,乍一看像是个视频或音频文件的命名,但背后其实涉及到一个很实际的问题:如何从零散的、非标准命名的文件里,快速判断内容类型、整理归档,或者…

2026/7/24 19:09:44 阅读更多 →
AnySearch:面向 AI 系统的基础AI 搜索工具技术解析

AnySearch:面向 AI 系统的基础AI 搜索工具技术解析

过去二十年,用户获取网络信息的主流方式,是通过关键词检索获得链接列表,再自行筛选阅读有效内容。随着大模型与检索增强生成技术的成熟,AI 搜索产品逐步走入大众视野,这类产品可在检索信息的基础上完成归纳整合&#x…

2026/7/24 19:09:44 阅读更多 →
Wand-Enhancer:零成本解锁WeMod专业版功能的终极解决方案

Wand-Enhancer:零成本解锁WeMod专业版功能的终极解决方案

Wand-Enhancer:零成本解锁WeMod专业版功能的终极解决方案 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer 还在为WeMod专业版的高昂订阅…

2026/7/24 19:09:44 阅读更多 →
嵌入式音频I2C通信实战:TAS3001C等待状态处理与驱动设计

嵌入式音频I2C通信实战:TAS3001C等待状态处理与驱动设计

1. 项目概述与核心挑战在嵌入式音频系统设计中,I2C总线因其简洁的两线制(SDA和SCL)和灵活的多主多从架构,成为了配置音频编解码器、均衡器、放大器等外设的首选通信协议。然而,当我们从配置简单的EEPROM转向控制像德州…

2026/7/24 19:08:44 阅读更多 →

日新闻

用Highcharts 创建可拖拽三维散点立方体3D图表

用Highcharts 创建可拖拽三维散点立方体3D图表

该案例基于Highcharts scatter3d 三维散点图实现空间立方体散点可视化,核心特色:三维 X/Y/Z 三轴空间,所有散点分布在 0~10 立方体空间内;散点使用径向渐变实现立体 3D 圆球质感;支持鼠标 / 触屏拖拽画布,…

2026/7/24 0:00:29 阅读更多 →
AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口

AppCertDlls:进程创建路径上的 DLL 入口 AppCertDlls 位于 HKLM\System\CurrentControlSet\Control\Session Manager\AppCertDlls。本文的程序功能是只读列出这个键在 64 位和 32 位注册表视图中的全部值,并显示每条值的来源、名称、类型和可安全显示的数…

2026/7/24 0:00:29 阅读更多 →
我的编程之路:第一篇博客

我的编程之路:第一篇博客

大家好,我是一名编程初学者,同时这也是我编程学习之路上的第一篇博客。在这里,我想要向大家介绍我的一些想法和规划。a.自我介绍我是一个刚刚接触编程的新手,目前在学习c语言,我对编程世界充满了强烈的好奇。当然&…

2026/7/24 0:00:29 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/24 3:59:20 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/24 1:23:39 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/24 18:52:18 阅读更多 →

月新闻