二维双指针,滑动窗口

二维双指针

在这里插入图片描述
思路:考虑暴力做法,我们统计前缀和,然后枚举以 ( x 1 , y 1 ) (x_1,y_1) (x1,y1), ( x 2 , y 2 ) (x_2,y_2) (x2,y2)为左上,右下顶点的矩阵有多少是合法的,那么,这样的时间复杂度为 n 4 n^4 n4。考虑进行优化,因为二维前缀和同样具有单调性,我们可以选择枚举左,右边界,然后对于枚举的左右边界,使用双指针进行上下边界的计算,这样的时间复杂度就降低为了 n 3 n^3 n3

#include <bits/stdc++.h>using namespace std;
const int N = 5e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<int, 3> ar;
int mod = 1e9+7;
// const int maxv = 4e6 + 5;
// #define endl "\n"int a[1005][1005];
int s[1005][1005];void solve()
{int n,m,k;cin>>n>>m>>k;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>a[i][j];s[i][j]=a[i][j]-s[i-1][j-1]+s[i][j-1]+s[i-1][j];}}ll ans=0;for(int i=1;i<=m;i++){for(int j=i;j<=m;j++){for(int c=1,t=1;c<=n;c++){while(t<=c&&s[c][j]+s[t-1][i-1]-s[t-1][j]-s[c][i-1]>k) t++;if(c>=t) ans+=c-t+1;}}}cout<<ans<<endl;} int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;// cin>>t;while(t--){solve();}system("pause");return 0;
}

二维滑动窗口

在这里插入图片描述
思路:首先考虑一维的情况,那么我们直接使用一个单调队列进行维护最大值和最小值即可,那么对于二维矩阵,以一个大小为 k × k k\times k k×k的矩阵为例,我们首先可以算出每一行中长度为k的最大值,此时我们知道了每一行的信息后,对于矩阵的最大值,肯定在前面已经算出来的行最大值中产生,我们再计算一遍列最大值即可。

#include <bits/stdc++.h>using namespace std;
const int N = 5e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<int, 3> ar;
int mod = 1e9+7;
// const int maxv = 4e6 + 5;
// #define endl "\n"int n,m,k;void solve()
{cin>>n>>m>>k;vector<vector<int>>a(n+5,vector<int> (m+5));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++) cin>>a[i][j];} vector<vector<int>> rminv(n+5,vector<int> (m+5)),rmaxv(n+5,vector<int> (m+5));//计算行最大值,rmaxv[i][j]代表第i行(j-k+1,j)内的最大值,rminv同理auto getmax=[](vector<int> a,vector<int>& rmaxv,int m)//单调队列维护滑动窗口{deque<int> q;for(int i=1;i<=m;i++){if(q.size()&&i-q.front()+1>k) q.pop_front();while(q.size()&&a[q.back()]<=a[i]) q.pop_back();q.push_back(i);rmaxv[i]=a[q.front()];}};auto getmin=[](vector<int> a,vector<int>& rminv,int m){deque<int> q;for(int i=1;i<=m;i++){if(q.size()&&i-q.front()+1>k) q.pop_front();while(q.size()&&a[q.back()]>=a[i]) q.pop_back();q.push_back(i);rminv[i]=a[q.front()];}};for(int i=1;i<=n;i++){getmax(a[i],rmaxv[i],m);getmin(a[i],rminv[i],m);}int ans=2e9;vector<int> cmaxv(n+5),cminv(n+5),b(n+5),c(n+5);//b,c数组用于保存n行的行最大值和最小值;cmaxv即为对n行的最大值进行计算,得出整个矩阵的最大值。for(int i=k;i<=m;i++){for(int j=1;j<=n;j++){b[j]=rmaxv[j][i];c[j]=rminv[j][i];}getmax(b,cmaxv,n);getmin(c,cminv,n);for(int i=k;i<=n;i++) ans=min(ans,cmaxv[i]-cminv[i]);}cout<<ans<<endl;
} int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;// cin>>t;while(t--){solve();}system("pause");return 0;
}

在这里插入图片描述
板子题,计算矩阵所有最大值的和即可。

#include <bits/stdc++.h>using namespace std;
const int N = 5e3 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<int, 3> ar;
int mod = 1e9+7;
// const int maxv = 4e6 + 5;
// #define endl "\n"int n,m,k;void solve()
{cin>>n>>m>>k;vector<vector<int>> a (n+5,vector<int> (m+5));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){a[i][j]=lcm(i,j);}} vector<vector<int>>rmaxv(n+5,vector<int> (m+5));auto getmax=[](vector<int> a,vector<int>& rmaxv,int m){deque<int> q;for(int i=1;i<=m;i++){if(q.size()&&i-q.front()+1>k) q.pop_front();while(q.size()&&a[q.back()]<=a[i]) q.pop_back();q.push_back(i);rmaxv[i]=a[q.front()];}};for(int i=1;i<=n;i++){getmax(a[i],rmaxv[i],m);}ll ans=0;vector<int> cmaxv(n+5),b(n+5);for(int i=k;i<=m;i++){for(int j=1;j<=n;j++){b[j]=rmaxv[j][i];}getmax(b,cmaxv,n);for(int i=k;i<=n;i++) ans+=(ll)cmaxv[i];}cout<<ans<<endl;
} int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t=1;// cin>>t;while(t--){solve();}system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/777522.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[k8s] kubectl执行失败后等待一段时间再重试 (Shell实现)

使用Shell脚本实现功能&#xff1a; kubectl执行失败后&#xff0c;等待30秒后再重试&#xff0c;一共重试3次&#xff0c;代码如下&#xff1a; #!/bin/bashKUBECTL_BIN/var/lib/snapd/snap/bin/kubectlERR_MSG_K8S_NOTRUNNING"microk8s is not running" ERR_MSG_C…

【二十七】【算法分析与设计】归并(1),912. 排序数组,归并排序,递归函数的时间复杂度计算,LCR 170. 交易逆序对的总数

912. 排序数组 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5] 提示&#xff1a; 1 < …

Linux 系统 CentOS7 上搭建 Hadoop HDFS集群详细步骤

集群搭建 整体思路:先在一个节点上安装、配置,然后再克隆出多个节点,修改 IP ,免密,主机名等 提前规划: 需要三个节点,主机名分别命名:node1、node2、node3 在下面对 node1 配置时,先假设 node2 和 node3 是存在的 **注意:**整个搭建过程,除了1和2 步,其他操作都使…

go中方法的Receiver (值类型指针类型)

在Go语言中&#xff0c;方法的接收者&#xff08;Receiver&#xff09;定义了该方法是与哪种类型的变量关联。方法的接收者可以是值类型也可以是指针类型&#xff0c;这决定了调用方法时是如何传递接收者的。 值类型与指针类型接收者 值类型接收者 当方法的接收者是值类型时&a…

自然语言处理(NLP)基础:文本预处理与词嵌入

目录 1.引言 2.文本预处理步骤 3.文本预处理工具 4.词嵌入模型介绍与应用 4.1.Word2Vec 4.2.GloVe 4.3.应用示例 5.总结 1.引言 自然语言处理&#xff08;Natural Language Processing, NLP&#xff09;是计算机科学与人工智能领域的重要分支&#xff0c;旨在使计算机理…

ChatGPT 商业金矿(下)

原文&#xff1a;ChatGPT Business Goldmines 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十七章&#xff1a;ChatGPT 商业金矿#15&#xff1a;在线课程创建业务 随着人们寻求便捷灵活的学习新技能、推进职业或探索新爱好的方式&#xff0c;在线课程变得越来越受…

基于Redis实现延时任务

两种方案&#xff1a; Redis 过期事件监听Redisson 内置的延时队列 Redis 过期事件监听这种方案存在很多问题&#xff0c;建议使用 Redisson 内置的 DelayedQueue 方案。 Redis 过期事件监听实现延时任务原理 Redis 2.0 引入了发布订阅 (pub/sub) 功能。 在 pub/sub 模式下…

Mini-Gemini: Mining the Potential of Multi-modality Vision Language Models

Mini-Gemini: Mining the Potential of Multi-modality Vision Language Models 相关链接&#xff1a;arxiv 关键字&#xff1a;Vision Language Models、Multi-modality、High-Resolution Visual Tokens、High-Quality Data、VLM-guided Generation 摘要 在这项工作中&#x…

unity学习(76)--窗口化和后台运行

1.通过如下方式将编译的游戏设置为窗口模式。 成功&#xff1a; 2.现在只有鼠标点击的窗体游戏运动&#xff0c;其他窗体游戏都会卡住。 2.1build setting中 2.2unity内部Project Settings 也被同步修改了

火车头通过关键词采集文章的原理

随着互联网信息的爆炸式增长&#xff0c;网站管理员和内容创作者需要不断更新和发布新的文章&#xff0c;以吸引更多的用户和提升网站的排名。而火车头作为一款智能文章采集工具&#xff0c;在这一过程中发挥着重要作用。本文将探讨火车头如何通过关键词采集文章&#xff0c;以…

CDH集群hive初始化元数据库失败

oracle数据库操作&#xff1a; 报错如下&#xff1a;命令 (Validate Hive Metastore schema (237)) 已失败 截图如下&#xff1a; 后台日志部分摘录&#xff1a; WARNING: Use “yarn jar” to launch YARN applications. SLF4J: Class path contains multiple SLF4J binding…

Vite 为什么比 Webpack 快?

目录 1. Webpack 的构建原理 2. Script 的模块化&#xff08;主流浏览器对 ES Modules 的支持&#xff09; 3. Webpack vs Vite 开发模式的差异 对 ES Modules 的支持 底层语言的差异 热更新的处理 1. Webpack 的构建原理 前端之所以需要类似于 Webpack 这样的构建工具&…

主机安全-德迅卫士

什么是主机安全&#xff1f; 主机安全&#xff0c;其核心内容包括安全应用交付系统、应用监管系统、操作系统安全增强系统和运维安全管控系统。它的具体功能是指保证主机在数据存储和处理的保密性、完整性&#xff0c;可用性&#xff0c;它包括硬件、固件、系统软件的自身安全&…

CMakeLists生成动态库.so和静态库.a

一、下载NDK CMake - NDK : 26.2.11394342 或 23.1.7779620 - CMake : 3.22.1 二、新建android\app\CMakeLists.txt 文件CMakeLists.txt内容 cmake_minimum_required(VERSION 3.4.1) #mker为项目名称 project(mker)#设置生成的so动态库最后输出的路径 set(CMAKE_LIBRARY_OUTP…

如何安装OceanBase的OBD

选择一&#xff1a;借助 all-in-one 安装包安装 OBD&#xff08;推荐&#xff09; OceanBase 社区版的all-in-one安装包是一个集成了多种工具的一键式安装包。它包含了数据库软件本身&#xff0c;以及OBD、OBProxy、OBClient&#xff0c;自4.1版本起&#xff0c;还额外加入了O…

面试算法-122-翻转二叉树

题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {return dfs(…

第二证券今日投资参考:低空经济迎利好 自动驾驶商业化提速

昨日&#xff0c;两市股指盘中弱势震动&#xff0c;午后加快下探&#xff0c;沪指失守3000点大关&#xff0c;深成指、创业板指跌超2%&#xff1b;到收盘&#xff0c;沪指跌1.26%报2993.14点&#xff0c;深成指跌2.4%报9222.47点&#xff0c;创业板指跌2.81%报1789.82点&#x…

DC电源模块的设计与制造流程

BOSHIDA DC电源模块的设计与制造流程 DC电源模块是一种用于将交流电转换为直流电的设备。它广泛应用于各种电子设备中&#xff0c;如电子产品、工业仪器、电视等。下面是DC电源模块的设计与制造流程的简要描述&#xff1a; 1. 需求分析&#xff1a;在设计DC电源模块之前&#…

设计模式(一)简介

一、书籍推荐及博客 大话设计模式 设计模式的艺术 XXL开源社区 | 博客 二、通俗版概念 创建型模式、结构型模式、行为型模式 怎么建房子、建什么样的房子、建的房子有什么用 三、重点模式及简述 1、创建型模式 工厂方法&#xff08;多态工厂的实现&#xff09; 抽象工厂…

flutter 中 GetxController 和 GetxService 的区别和使用场景

区别&#xff1a; GetxController&#xff1a; GetxController 用于管理特定页面或 widget 的状态。每个页面或 widget 可以拥有一个或多个 GetxController&#xff0c;用于管理其自身的状态和逻辑。GetxController 是短暂存在的&#xff0c;通常与页面或 widget 的生命周期相关…