首页 > 其他分享 >单调队列优化

单调队列优化

时间:2023-04-21 12:35:11浏览次数:91  
标签:rmin 队列 rmax 矩阵 int 最小值 数组 优化 单调

1. 子矩阵

来源:第十四届蓝桥杯省赛C++C组
题目链接

题目描述

给定一个 $n × m$ ($n$ 行 $m$ 列)的矩阵。

设一个矩阵的价值为其所有数中的最大值和最小值的乘积。

求给定矩阵的所有大小为 $a × b$ ($a$ 行 $b$ 列)的子矩阵的价值的和。

答案可能很大,你只需要输出答案对 $998244353$ 取模后的结果。

输入格式

输入的第一行包含四个整数分别表示 $n, m, a, b$,相邻整数之间使用一个空格分隔。

接下来 $n$ 行每行包含 $m$ 个整数,相邻整数之间使用一个空格分隔,表示矩阵中的每个数 $A_{i,j}$。

输出格式

输出一行包含一个整数表示答案。

数据范围

对于 $40\%$ 的评测用例,$1 ≤ n, m ≤ 100$;
对于 $70\%$ 的评测用例,$1 ≤ n, m ≤ 500$;
对于所有评测用例,$1 ≤ a ≤ n ≤ 1000$,$1 ≤ b ≤ m ≤ 1000$,$1 ≤ A_{i,j} ≤ 10^9$。

输入样例:

2 3 1 2
1 2 3
4 5 6

输出样例:

58

样例解释

$1 × 2 + 2 × 3 + 4 × 5 + 5 × 6 = 58$。


算法:(单调队列)\(O(nm)\)

算法内容

  • 我们用单调队列优化求解二维矩阵的最大值和最小值的过程。

  • 首先用\(rmin\)和\(rmax\)数组预处理原数组中每一行的长度为\(b\)的滑动窗口的最小值和最大值,预处理完成后,\(rmin(i, j)\)即\(rmin\)数组的第\(i\)行第\(j\)列的元素的值就是原数组的第\(i\)行中前\(j\)个元素中的最小值;然后我们用\(resmin\)和\(resmax\)数组预处理\(rmin\)和\(rmax\)数组中的每一列的长度为\(a\)的最小值和最大值,注意此时我们要把\(rmin\)和\(rmax\)数组中的每一列的元素拿出来放到一个临时数组里才能传入函数。

  • 行列都预处理完成后,每一个子矩阵的右下角的\(rmin\)和\(rmax\)的值就是整个子矩阵的最小值和最大值。

C++代码

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

typedef long long LL;

const int N = 1010, mod = 998244353;

int n, m, a, b;
int w[N][N];
int q[N];
int rmin[N][N], rmax[N][N];

void get_min(int arr[], int res[], int tot, int k)
{
    int hh = 0, tt = -1;
    for (int i = 1; i <= tot; i ++ )
    {
        if (hh <= tt && q[hh] < i - k + 1) hh ++ ;
        while (hh <= tt && arr[q[tt]] >= arr[i]) tt -- ;
        q[++ tt] = i;
        res[i] = arr[q[hh]];
    }
}

void get_max(int arr[], int res[], int tot, int k)
{
    int hh = 0, tt = -1;
    for (int i = 1; i <= tot; i ++ )
    {
        if (hh <= tt && q[hh] < i - k + 1) hh ++ ;
        while (hh <= tt && arr[q[tt]] <= arr[i]) tt -- ;
        q[++ tt] = i;
        res[i] = arr[q[hh]];
    }
}

int main()
{
    cin >> n >> m >> a >> b;
    for (int i = 1; i <= n; i ++ )
        for (int j = 1; j <= m; j ++ )
            scanf("%d", &w[i][j]);
    
    for (int i = 1; i <= n; i ++ )
    {
        get_min(w[i], rmin[i], m, b);
        get_max(w[i], rmax[i], m, b);
    }
    
    LL ans = 0;
    
    int arr[N], resmin[N], resmax[N];
    for (int col = b; col <= m; col ++ ) //枚举列
    {
        for (int i = 1; i <= n; i ++ ) arr[i] = rmin[i][col];
        get_min(arr, resmin, n, a);
        
        for (int i = 1; i <= n; i ++ ) arr[i] = rmax[i][col];
        get_max(arr, resmax, n, a);
        
        for (int i = a; i <= n; i ++ )
            ans = (ans + (LL)resmin[i] * resmax[i]) % mod;
    }
    
    cout << ans << endl;
    
    return 0;
}

标签:rmin,队列,rmax,矩阵,int,最小值,数组,优化,单调
From: https://www.cnblogs.com/lhycoder/p/17339941.html

相关文章

  • 单调队列(例题详解+模板cpp)
    有一类问题需要维护一段区间内的最大值或最小值,例如滑动窗口、区间最值等问题。一般情况下,我们可以使用线段树、ST表等数据结构来解决这类问题,但是这些数据结构的实现较为复杂,需要一定的时间和精力来学习和掌握。而单调队列则是一个简单而高效的数据结构,可以用来解决这类问题。基本......
  • Android性能优化—StrictMode的使用
    原文地址zhuanlan.zhihu.com残枫cps原文地址juejin.cnStrictMode是Android开发过程中一个必不可缺的性能检测工具,他能帮助开发检测出一些不合理的代码块。策略分类StrictMode分为线程策略(ThreadPolicy)和虚拟机策略(VmPolicy)线程策略(ThreadPolicy)线程策略主要包含了以......
  • 基于GA遗传优化的列车交路方案matlab仿真
    1.算法描述        列车交路是指列车在规定的运行线路上往返运行的方式,规定了列车运行区段、折返车站以及按不同交路运行的列车对数.        机车交路并不是完全意义的指标或标准,但在运输体系中是一个体现模式作用对运输组织工作重要的技术经济课题。对于新建......
  • 队列
    队列:也是一个线性表(即包括顺序队列和链式队列),先进先出,但限制在两端进行插入和删除队尾:进行存入操作的一端队头:进行删除操作的一端顺序队列://sqqueue.h#ifndef_SQ_QUEUE_H_H#define_SQ_QUEUE_H_H#defineN6typedefintdata_t;typedefstruct{data......
  • C++基础2: 优化C函数
    1.缺省参数什么是缺省参数缺省参数是声明或者定义函数时为函数的参数指定一个默认值,如果函数调用时没有传入实参,那么这个默认值会被当做实参,如下例子函数调用时,传入参数1,a=1,不传入参数,默认a=0,这里的a就是一个缺省参数缺省参数的分类缺省参数分全缺省和半缺省......
  • 队列和栈的简单实现
    简单实现2个数据结构,来帮助我们更好的处理数据基本队列(Queue)是一种先进先出(FIFO)的数据结构,通常用于按照顺序处理任务或事件。在前端中,队列可以用于实现异步函数的调用、消息通知、动画播放等场景。队列还可以和数组结合使用,通过push()方法将元素添加到队列尾部,shift()方法将......
  • 双端队列数据结构
    双端队列是一种数据结构,也被称为deque或double-endedqueue。它类似于队列,但它允许从队列的两端添加或删除元素,而不仅仅是队列的一端。双端队列可以用数组或链表实现。如果使用数组实现,它可以使用循环数组的方式,使得在头尾进行插入和删除的操作可以在常数时间内完成。如果使用链......
  • django中开启事务,GEO地理位置信息、持久化方案、主从复制原理和方案、哨兵高可用、集
    django中开启事务#django中如何开启事务全局开启:每个http请求都在一个事务中DATABASES={'default':{'ENGINE':'django.db.backends.mysql','NAME':'lqz','HOST'......
  • Sql Server 数据库优化
    从高明到普通一共有4种优化方式:1、架构优化:最优解,一般来说在高并发的场景下对架构层进行优化其效果最为明显,常见的优化手段有:分布式缓存,读写分离,分库分表等,每种优化手段又适用于不同的应用场景。2、硬件优化:有钱能使鬼推磨,性能差了、反应慢了,就更新/迭代,从物理层次高纬度打击,机......
  • 正版Abaqus软件价格贵?许可优化可解决预算不足许可不够用问题!
    随着计算机技术的发展和普及,各类软件已经成为现代生产和研究工作的重要工具。ABAQUS软件作为有限元分析软件的代表,具有广泛的应用领域和丰富的功能,成为了科研机构和企业所青睐的工具之一。然而,其高昂的许可证价格,往往使得机构和企业难以承担。针对这一问题,本文围绕浮点许可优化管理......