二维双指针,滑动窗口

news2024/11/15 13:59:02

二维双指针

在这里插入图片描述
思路:考虑暴力做法,我们统计前缀和,然后枚举以 ( 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.coloradmin.cn/o/1552576.html

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

相关文章

【MySQL】15. 事务管理(重点) -- 1

1. CURD不加控制&#xff0c;会有什么问题&#xff1f; 2. CURD满足什么属性&#xff0c;能解决上述问题&#xff1f; 买票的过程得是原子的 ?买票互相应该不能影响 ?买完票应该要永久有效 ?买前&#xff0c;和买后都要是确定的状态? 3. 什么是事务&#xff1f; 事务就是…

ROUYI框架地址

1、原版系统地址与文档 https://gitee.com/dromara/RuoYi-Cloud-Plus?_fromgitee_search 源码地址 https://plus-doc.dromara.org/#/ruoyi-cloud-plus/home 后端地址 https://plus-doc.dromara.org/#/plus-ui/home 前端地址 前端代码地址&#xff1a; RuoYi-Vue-Plus: 多租户…

边缘计算与云计算总结

一. EdgeGallery 简介 MEC场景下的EdgeGallery是让资源边缘化&#xff0c;实时完成移动网络边缘的业务处理&#xff0c;MEC场景下的EdgeGallery让开发者能更便捷地使用 5G 网络能力&#xff0c;让5G能力在边缘触手可及。 EdgeGallery是由华为、信通院、中国移动、中国联通、…

玫瑰图和雷达图(自备)

目录 玫瑰图 数据格式 绘图基础 绘图升级&#xff08;文本调整&#xff09; 玫瑰图 下载数据data/2020/2020-11-24 mirrors_rfordatascience/tidytuesday - 码云 - 开源中国 (gitee.com) R语言绘图—南丁格尔玫瑰图 - 知乎 (zhihu.com) 数据格式 rm(list ls()) libr…

jmockit-01-test 之 jmockit 入门使用案例

拓展阅读 jmockit-01-jmockit 入门使用案例 jmockit-02-概览 jmockit-03-Mocking 模拟 jmockit-04-Faking 伪造 jmockit-05-代码覆盖率 mockito-01-入门介绍 mockito-02-springaop 整合遇到的问题&#xff0c;失效 jmockit 说明 jmockit 可以提供基于 mock 的测试能力…

​python学习之变量类型​

print单纯输中的十种数据类型只需要用print()函数即可&#xff0c;()里面直接写变量名。 下面重点介绍print格式输出&#xff1a; 第一种方法&#xff1a;一个萝卜一个坑&#xff0c;下面的代码中&#xff0c;{0}、{1}、{2}分别表示j,i,j*i&#xff0c;单引号里面是输出格式。…

【网安小白成长之路】3.MySQL环境配置以及常用命令(增删改查)

&#x1f42e;博主syst1m 带你 acquire knowledge&#xff01; ✨博客首页——syst1m的博客&#x1f498; &#x1f51e; 《网安小白成长之路(我要变成大佬&#x1f60e;&#xff01;&#xff01;)》真实小白学习历程&#xff0c;手把手带你一起从入门到入狱&#x1f6ad; &…

深度学习语义分割篇——DeepLabV2原理详解篇

&#x1f34a;作者简介&#xff1a;秃头小苏&#xff0c;致力于用最通俗的语言描述问题 &#x1f34a;专栏推荐&#xff1a;深度学习网络原理与实战 &#x1f34a;近期目标&#xff1a;写好专栏的每一篇文章 &#x1f34a;支持小苏&#xff1a;点赞&#x1f44d;&#x1f3fc;、…

R语言做两次分类,再做两两T检验,最终输出均值和pvalue

1.输入文件&#xff1a; 2.代码&#xff1a; setwd("E:/R/Rscripts/rG4相关绘图")# 加载所需的库 library(tidyverse)# 读取CSV文件 data <- read.csv("box-cds-ABD-不同类型rg4-2.csv", stringsAsFactors FALSE)# 组合Type1和Type2&#xff1a;通过…

GeoServer 2.25.0 发布新功能及升级

GeoServer 2.25.0版本现已提供下载&#xff08;bin、 war、 windows&#xff09;以及 文档和 扩展。 这是推荐用于生产用途的 GeoServer 的稳定版本。GeoServer 2.25.0 是与 GeoTools 31.0 和 GeoWebCache 1.25.0 结合使用的。 安全升级 此版本解决了多个安全漏洞&#xff0c…

3723. 字符串查询:做题笔记

目录 思路 代码 注意点 3723. 字符串查询 思路 这道题感觉和常见的前缀和问题不太一样&#xff0c;前缀和的另一种应用&#xff1a;可以统计次数。 这道题我们想判断一个单词的其中一段子序列A是否可以通过重新排列得到另一段子序列B。 我看到这道题的时候想着可能要判…

Flutter 中的 ScrollNotification 为啥收不到

1. 需求 在做智家 APP 悬浮窗优化需求时&#xff0c;需要获取列表的滑动并通知悬浮窗进行收起或全部显示。 基础库同事已经把 基础逻辑整理好如下&#xff1a; NotificationListener<ScrollNotification>(onNotification: (notification){//1.监听事件的类型if (notif…

STM32实现三个串口同时开启发送接收数据

程序目的&#xff1a; 实现STM32开通三个串口&#xff0c;每个串口都可以实现接收和发送数据。 注意事项&#xff1a; 编程时&#xff0c;严禁在中断函数中写入发送串口数据代码&#xff0c;否则会出错&#xff0c;具体原因不清楚&#xff08;有大佬知道的话帮我指出&#xff…

C#String的remove的用法

string test "abc";string temp test;temp.Remove(0, 1);temp temp.Remove(0, 1);Console.WriteLine(temp);Console.WriteLine(test);执行结果

UE RPC 外网联机(1)

技术&#xff1a;RPC TCP通信 设计&#xff1a;大厅服务<---TCP--->房间服务<---RPC--->客户端&#xff08;Creator / Participator&#xff09; 1. PlayerController 用于RPC通信控制 2.GameMode 用于数据同步 3.类图 4. 注意 &#xff08;1&#xff09;RPC&a…

uniapp h5 touch事件踩坑记录

场景&#xff1a;悬浮球功能 当我给悬浮球设置了 position: fixed; 然后监听悬浮球的touch事件&#xff0c;从事件对象中拿到clientY和clientX赋值给悬浮球的left和top属性。当直接赋值后效果应该是这样子&#xff1a; 注意鼠标相对悬浮球的位置&#xff0c;应该就是左上角&a…

深度学习论文: Attention is All You Need及其PyTorch实现

深度学习论文: Attention is All You Need及其PyTorch实现 Attention is All You Need PDF:https://arxiv.org/abs/1706.03762.pdf PyTorch: https://github.com/shanglianlm0525/PyTorch-Networks 大多数先进的神经序列转换模型采用编码器-解码器结构&#xff0c;其中编码器将…

力扣热门算法题 135. 分发糖果,146. LRU 缓存,148. 排序链表

135. 分发糖果&#xff0c;146. LRU 缓存&#xff0c;148. 排序链表&#xff0c;每题做详细思路梳理&#xff0c;配套Python&Java双语代码&#xff0c; 2024.03.28 可通过leetcode所有测试用例。 目录 135. 分发糖果 解题思路 完整代码 Python Java 146. LRU 缓存 …

Mybatis别名 动态sql语句 分页查询

给Mybatis的实体类起别名 给Mybatis的xml文件注册mapper映射文件 动态sql语句 1 if 2 choose 3 where 4 foreach 一&#xff09;if 查询指定名称商品信息 语法&#xff1a; SELECT * FROM goods where 11 <if test "gName!null"> and g.g_name like co…

|行业洞察·手机|《2024手机行业及营销趋势报告-18页》

报告的主要内容解读&#xff1a; 手机行业概述及品牌分布&#xff1a; 2022年&#xff0c;受疫情影响&#xff0c;中国国内手机市场出货量下降22.6%&#xff0c;总计2.72亿部。5G手机市场占有率中&#xff0c;苹果领先&#xff0c;其次是vivo、OPPO和华为。消费者换机时更注重性…