热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

[BZOJ1047][HAOI2007]单调队列在理想正方形问题中的应用与优化

本文探讨了在解决理想正方形问题时,如何利用单调队列进行高效优化。具体而言,给定一个由整数组成的\(a\timesb\)矩阵,目标是从中找到一个\(n\timesn\)的子矩阵,使该子矩阵内所有元素的最大值与最小值之差最小。输入部分首先提供三个整数,分别表示矩阵的行数、列数以及子矩阵的边长。通过引入单调队列,算法能够显著提高搜索效率,从而快速找到最优解。

Description

  有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值
的差最小。

Input

  第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每
行相邻两数之间用一空格分隔。
100%的数据2<=a,b<=1000,n<=a,n<=b,n<=100

Output

  仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值。

Sample Input

5 4 2
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2

Sample Output

1

HINT

Source

Solution

  开始想用二维$ST$表,查了题解发现有复杂度更低的,,,

  由于限定了矩阵长和宽都为$n$,于是就有了滑动窗口最大最小值的感觉

  将每个点开始向左$n$个点的最大最小值算出来,对行使用单调队列求最值

  接着将每个点作为右下角的$n*n$的矩阵的最大最小值求出来,使用刚才算出来的值,对列使用单调队列求最值

  这样我们就算出来了每一个点对应的矩形的最大值减最小值

 1 #include 
2 using namespace std;
3 int q[1005], c[1005][1005], r[4][1005][1005];
4 int main()
5 {
6 int a, b, n, front, back, ans = 1000000000;
7 scanf("%d%d%d", &a, &b, &n);
8 for(int i = 1; i <= a; ++i)
9 for(int j = 1; j <= b; ++j)
10 scanf("%d", &c[i][j]);
11 for(int i = 1; i <= a; ++i)
12 {
13 frOnt= back = 0;
14 for(int j = 1; j <= b; ++j)
15 {
16 if(front != back && j - q[front + 1] == n)
17 ++front;
18 while(front != back && c[i][j] <= c[i][q[back]])
19 --back;
20 q[++back] = j;
21 r[0][i][j] = c[i][q[front + 1]];
22 }
23 frOnt= back = 0;
24 for(int j = 1; j <= b; ++j)
25 {
26 if(front != back && j - q[front + 1] == n)
27 ++front;
28 while(front != back && c[i][j] >= c[i][q[back]])
29 --back;
30 q[++back] = j;
31 r[1][i][j] = c[i][q[front + 1]];
32 }
33 }
34 for(int j = n; j <= b; ++j)
35 {
36 frOnt= back = 0;
37 for(int i = 1; i <= a; ++i)
38 {
39 if(front != back && i - q[front + 1] == n)
40 ++front;
41 while(front != back && r[0][i][j] <= r[0][q[back]][j])
42 --back;
43 q[++back] = i;
44 r[2][i][j] = r[0][q[front + 1]][j];
45 }
46 frOnt= back = 0;
47 for(int i = 1; i <= a; ++i)
48 {
49 if(front != back && i - q[front + 1] == n)
50 ++front;
51 while(front != back && r[1][i][j] >= r[1][q[back]][j])
52 --back;
53 q[++back] = i;
54 r[3][i][j] = r[1][q[front + 1]][j];
55 }
56 }
57 for(int i = n; i <= a; ++i)
58 for(int j = n; j <= b; ++j)
59 ans = min(ans, r[3][i][j] - r[2][i][j]);
60 printf("%d\n", ans);
61 return 0;
62 }
View Code

 


推荐阅读
  • 在HDU 1166敌军布阵问题中,通过运用线段树数据结构,可以高效地计算指定区间的敌军数量。该算法不仅能够在限定的时间和内存条件下快速求解,还能够灵活应对动态变化的战场局势,为实时决策提供支持。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 每日精选Codeforces训练题:1119E(贪心算法)、821C(栈模拟)和645D(拓扑排序)
    题目涉及三种不同类型的算法问题:1119E(贪心算法)、821C(栈模拟)和645D(拓扑排序)。其中,1119E的问题背景是有n种不同长度的棍子,长度分别为2^0, 2^1, …, 2^(n-1),每种棍子的数量为a[i]。任务是计算可以组成的三角形数量。根据三角形的性质,任意两边之和必须大于第三边。该问题可以通过贪心算法高效解决,通过合理选择棍子组合来最大化三角形的数量。 ... [详细]
  • 在牛客2021多校竞赛的一道题目中,涉及了5000×5000×5000的复杂度计算。实验结果显示,使用bitset进行数据处理仅需140毫秒,而使用bool数组则显著较慢。本文通过详细的性能分析,探讨了bitset与bool在数据处理速度上的差异,并提出了针对不同应用场景的优化建议。具体来说,bitset在位级操作上具有更高的效率,适用于大规模数据处理任务,而bool数组则在某些特定场景下更为灵活。通过对这两种数据结构的深入对比,本文旨在为开发者提供选择合适数据结构的参考依据。 ... [详细]
  • HDU1176:免费馅饼问题的动态规划解法分析
    题目“免费馅饼”通过动态规划方法进行了解析。该问题的时间限制为 Java 2000ms 和其他语言 1000ms,内存限制为 Java 65536K 和其他语言 32768K。本文详细探讨了如何利用动态规划算法高效求解此问题,并对算法的时间复杂度和空间复杂度进行了深入分析。此外,还提供了具体的实现步骤和代码示例,帮助读者更好地理解和应用这一方法。 ... [详细]
  • 如何高效启动大数据应用之旅?
    在前一篇文章中,我探讨了大数据的定义及其与数据挖掘的区别。本文将重点介绍如何高效启动大数据应用项目,涵盖关键步骤和最佳实践,帮助读者快速踏上大数据之旅。 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 指针内容的扩展与深化解析 ... [详细]
  • 本文详细解析了九度编程平台上的斐波那契数列高效算法挑战(题目编号:1387)。该挑战要求在1秒的时间限制和32兆的内存限制下,设计出高效的斐波那契数列计算方法。通过多种算法的对比和性能分析,本文提供了优化方案,帮助参赛者在限定资源条件下实现高效计算。 ... [详细]
  • 如何利用正则表达式(regexp)实现高效的模式匹配?本文探讨了正则表达式在编程中的应用,并分析了一个示例程序中存在的问题。通过具体的代码示例,指出该程序在定义和使用正则表达式时的不当之处,旨在帮助读者更好地理解和应用正则表达式技术。 ... [详细]
  • 针对NOJ1102黑白图像问题,本文采用深度优先搜索算法进行详细分析与实现。该问题要求在给定的时间限制(普通Java为1000-3000毫秒)和内存限制(65536KByte)内,处理一个n×n的黑白图像。通过对图像的逐像素遍历,利用深度优先搜索算法有效地识别并标记相连的黑色区域,从而实现图像的高效处理。实验结果显示,该方法在多种测试用例中均能稳定达到预期效果,具有较高的准确性和效率。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 求助高手调试程序,非常感谢您的支持!在编写C语言程序时遇到了一些问题,具体代码如下:```c#include #include #include #define MAX 50int t;```希望有经验的开发者能提供指导,帮助解决调试中的难题。感谢您的时间和帮助! ... [详细]
  • 利用Flask框架进行高效Web应用开发
    本文探讨了如何利用Flask框架高效开发Web应用,以满足特定业务需求。具体案例中,一家餐厅希望每天推出不同的特色菜,并通过网站向顾客展示当天的特色菜。此外,还增加了一个介绍页面,在bios路径下详细展示了餐厅主人、厨师和服务员的背景和简介。通过Flask框架的灵活配置和简洁代码,实现了这一功能,提升了用户体验和餐厅的管理水平。 ... [详细]
  • 在第二课中,我们将深入探讨Scala的面向对象编程核心概念及其在Spark源码中的应用。首先,通过详细的实战案例,全面解析Scala中的类和对象。作为一门纯面向对象的语言,Scala的类设计和对象使用是理解其面向对象特性的关键。此外,我们还将介绍如何通过阅读Spark源码来进一步巩固对这些概念的理解。这不仅有助于提升编程技能,还能为后续的高级应用开发打下坚实的基础。 ... [详细]
author-avatar
文民左
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有