2023河南萌新联赛第(五)场 K.01BFS

news2024/11/27 22:32:29

文章目录

  • 传送门
  • 题目大意
  • 题解
  • 参考代码

传送门

https://ac.nowcoder.com/acm/contest/62977/K

题目大意

给定一个 n × m n \times m n×m 的矩阵 G G G ,每个点有权值 G i , j G_{i,j} Gi,j,开始可以选择一个方向跳,每次跳跃只能跳到严格大于当前点权的位置。跳跃过程中总共可以转一次方向,求最多可以跳几次。

题解

不妨枚举它的转弯点和它的方向,
例如,从上方来到转弯点,
它可以选择往左或往右跳(或者往前跳,即放弃转弯机会)。
在这里插入图片描述
剩下的就是单向操作了,可以预处理。
问题转化为了如何处理一行或一列的最长单调 下降/上升 子序列。
对于这个问题,要求 n l o g n n logn nlogn n n n \sqrt n nn 解决,考虑优化。
理想的,有一条优秀的序列,将它直接插入该序列中,查找比它小的个数就可以得到最大的解。
显然的,该序列是单调的,且需要有尽可能多的数,在满足单调性的同时,我们要使两两差尽可能小。
故每次维护只需要把一个大于或等于当前权值的数代替即可。如果大于顶部元素,直接加入即可。
对于这个问题,跑 8 8 8 次查询就可以维护好了。

参考代码

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int n,m,T;
int st[N];
int ans;
int main()
{
    cin>>T;
    while(T--)
    {
        ans=0;
        scanf("%d%d",&n,&m);
        vector<vector<int>>v(n+1,vector<int>(m+1));
        vector<vector<int>>v1(n+1,vector<int>(m+1));  //横着从左往右递增
        vector<vector<int>>v2(n+1,vector<int>(m+1));  //横着从右往左递增
        vector<vector<int>>v3(n+1,vector<int>(m+1));  //横着从左往右递减
        vector<vector<int>>v4(n+1,vector<int>(m+1));  //横着从右往左递减
        vector<vector<int>>v5(n+1,vector<int>(m+1));  //横着从下往上递增
        vector<vector<int>>v6(n+1,vector<int>(m+1));  //横着从上往下递增
        vector<vector<int>>v7(n+1,vector<int>(m+1));  //横着从下往上递减
        vector<vector<int>>v8(n+1,vector<int>(m+1));  //横着从上往下递减
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&v[i][j]);
        for(int i=1;i<=n;i++)
        {
            int tot=0;
            st[tot]=0;
            for(int j=1;j<=m;j++)
            {
                if(v[i][j]>st[tot])
                {
                    st[++tot]=v[i][j];  
                    v1[i][j]=tot-1;
                }
                else
                {
                    int id=lower_bound(st+1,st+tot+1,v[i][j])-st;   
                    st[id]=v[i][j];
                    v1[i][j]=id-1;
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            int tot=0;
            st[tot]=-N;
            for(int j=1;j<=m;j++)
            {
                if(-v[i][j]>st[tot])
                {
                    st[++tot]=-v[i][j];  
                    v3[i][j]=tot-1;
                }
                else
                {
                    int id=lower_bound(st+1,st+tot+1,-v[i][j])-st;   
                    st[id]=-v[i][j];
                    v3[i][j]=id-1;
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            int tot=0;
            st[tot]=0;
            for(int j=m;j>=1;j--)
            {
                if(v[i][j]>st[tot])
                {
                    st[++tot]=v[i][j];  
                    v2[i][j]=tot-1;
                }
                else
                {
                    int id=lower_bound(st+1,st+tot+1,v[i][j])-st;   
                    st[id]=v[i][j];
                    v2[i][j]=id-1;
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            int tot=0;
            st[tot]=-N; 
            for(int j=m;j>=1;j--)
            {
                if(-v[i][j]>st[tot])
                {
                    st[++tot]=-v[i][j];  
                    v4[i][j]=tot-1;
                }
                else
                {
                    int id=lower_bound(st+1,st+tot+1,-v[i][j])-st;   
                    st[id]=-v[i][j];
                    v4[i][j]=id-1;
                }
            }
        }
        for(int i=1;i<=m;i++)
        {
            int tot=0;
            st[tot]=0;
            for(int j=1;j<=n;j++)
            {
                if(v[j][i]>st[tot])
                {
                    st[++tot]=v[j][i];  
                    v5[j][i]=tot-1;
                }
                else
                {
                    int id=lower_bound(st+1,st+tot+1,v[j][i])-st;   
                    st[id]=v[j][i];
                    v5[j][i]=id-1;
                }
            }
        }
        for(int i=1;i<=m;i++)
        {
            int tot=0;
            st[tot]=-N;
            for(int j=1;j<=n;j++)
            {
                if(-v[j][i]>st[tot])
                {
                    st[++tot]=-v[j][i];  
                    v7[j][i]=tot-1;
                }
                else
                {
                    int id=lower_bound(st+1,st+tot+1,-v[j][i])-st;   
                    st[id]=-v[j][i];
                    v7[j][i]=id-1;
                }
            }
        }
        for(int i=1;i<=m;i++)
        {
            int tot=0;
            st[tot]=0;
            for(int j=n;j>=1;j--)
            {
                if(v[j][i]>st[tot])
                {
                    st[++tot]=v[j][i];  
                    v6[j][i]=tot-1;
                }
                else
                {
                    int id=lower_bound(st+1,st+tot+1,v[j][i])-st;   
                    st[id]=v[j][i];
                    v6[j][i]=id-1;
                }
            }
        }
        for(int i=1;i<=m;i++)
        {
            int tot=0;
            st[tot]=-N;
            for(int j=n;j>=1;j--)
            {
                if(-v[j][i]>st[tot])
                {
                    st[++tot]=-v[j][i];  
                    v8[j][i]=tot-1;
                }
                else
                {
                    int id=lower_bound(st+1,st+tot+1,-v[j][i])-st;   
                    st[id]=-v[j][i];
                    v8[j][i]=id-1;
                }
            }
        }
//        cout<<v1[2][4]<<" "<<v2[2][4]<<" "<<v3[2][4]<<" "<<v4[2][4]<<"\n";
//        cout<<v5[2][4]<<" "<<v6[2][4]<<" "<<v7[2][4]<<" "<<v8[2][4]<<"\n";
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
            {
//            	cout<<v1[i][j]<<" "<<v2[i][j]<<" "<<v3[i][j]<<" "<<v4[i][j]<<endl;
                int sum=0;
                sum            =max(sum,max(v1[i][j]+v7[i][j],
                                max(v1[i][j]+v8[i][j],
                                max(v2[i][j]+v7[i][j],
                                max(v2[i][j]+v8[i][j],
                                max(v5[i][j]+v3[i][j],
                                max(v5[i][j]+v4[i][j],
                                max(v6[i][j]+v3[i][j],
                                max(v6[i][j]+v4[i][j],
                                max(v1[i][j]+v4[i][j],
                                max(v2[i][j]+v3[i][j],
                                max(v5[i][j]+v8[i][j],
                                v6[i][j]+v7[i][j])
                               )
                               )
                               )
                               )
                               )
                               )
                               )
                               )
                               )
                               )
                               )+1;
                if(sum>ans)
                {
                    ans=sum;
//                    cout<<i<<" "<<j<<endl;
//                    cout<<sum<<endl;
                }
            }
                
        printf("%d\n",ans);
    }
}

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

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

相关文章

ECharts 折线图使用相关

一、折线图堆叠设置为不堆叠的方法 官网是这样的&#xff0c;但是不需要这种堆叠形式的如下图&#xff1a; 即&#xff1a;第2条数据值 第1条数据值 第2条数据值 第3条数据值 第2条数据值 第3条数据值 需要改成实际值展示&#xff0c;如下图&#xff1a; 只需要修改stack的…

湖南麒麟系统非正常关机导致VNC启动失败原因分析

1、故障描述 掉电后&#xff0c;启动vncserver无法启动&#xff0c;或启动后连接vncserver黑屏 2、影响范围 非正常关机流程的机器 3、故障处理过程 第一次开机后vncserver服务无法正常启动&#xff0c;使用restart手动也无法拉起。按照现场人员提醒使用reboot命令重启机器…

递归神经网络简介

一、说明 说起递归神经网络&#xff0c;递归神经网络&#xff08;RNN&#xff09;主要包括以下几种类型&#xff1a; 简单的RNN&#xff08;Simple RNN&#xff09;&#xff1a;最基本的RNN类型&#xff0c;每个时刻的输出都与前面时刻的状态有关。 循环神经网络&#xff08;R…

软件第三方CMA、CNAS测试的目的和意义,信息化建设验收测试依据是什么?

在当今互联网时代&#xff0c;软件的第三方CMA、CNAS测试成为了软件行业的重要环节。那么&#xff0c;这个测试的目的和意义是什么呢?另外&#xff0c;信息化建设验收测试依据又是什么呢?    一、软件测试第三方CMA、CNAS测试的目的和意义 1、研究进展 随着软件行业的迅…

低成本无刷高速吹风机单片机方案

高速吹风机的转速一般是普通吹风机的5倍左右。一般来说&#xff0c;吹风机的电机转速一般为2-3万转/分钟&#xff0c;而高速吹风机的电机转速一般为10万转/分钟左右。高转速增加了高风速。一般来说&#xff0c;吹风机的风力只有12-17米/秒&#xff0c;而高速吹风机的风力可以达…

信号浪涌保护器的综合应用方案

信号浪涌保护器是一种用于保护电子设备免受信号线路上的瞬态过电压和浪涌电流的影响的装置。信号浪涌保护器的原理是利用气体放电管、压敏电阻、齐纳二极管等元件&#xff0c;将信号线路上的过高电压限制在一定范围内&#xff0c;或将浪涌电流分流到地线上&#xff0c;从而减少…

gradio解决上传文件数最大为1000的限制

当使用上传文件夹功能传输超过1000个文件时&#xff0c;会报出以下错误&#xff1a; 在github上&#xff0c;最新版的gradio仓库已经解决了这一问题&#xff1a; 但是这一更改还没有正式发布&#xff0c;因此无法使用pip更新&#xff1a; 因此只能先手动git clone https://g…

webstorm debug调试vue项目

1.运行npm&#xff0c;然后控制台会打印下图中的地址&#xff0c;复制local的地址 2.run–>Edit Configuration&#xff0c;如下图 3.设置测试项 4.在你需要的js段打好断点 5.在上边框的工具栏里面有debug运行&#xff0c;点击debug运行的图标运行即可

vue新学习 05vue的创建运行原理(vue的生命周期)

01.vue的创建过程 原理解释&#xff1a; 1.定义&#xff1a; 1.Vue的生命周期是指Vue实例从创建到销毁的整个过程中经历的一系列阶段&#xff0c;Vue在关键时刻帮我们调用的一些特殊名称的函数。 2.生命周期函数的名字不可更改&#xff0c;但函数的具体内容是程序员根据需求…

星戈瑞NH2-PEG-ICG应用纳米荧光成像

欢迎来到星戈瑞荧光stargraydye! NH2-PEG-ICG是一种具有胺基的聚乙二醇修饰的吲哚菁绿染料&#xff0c;常用于纳米荧光成像应用。以下是NH2-PEG-ICG在纳米荧光成像应用中的一些特点和优势&#xff1a; **1. 荧光性能&#xff1a;**NH2-PEG-ICG在近红外光谱区域&#xff08;约7…

电商数据API接口有什么作用和意义,让我们来了解一下吧!

在现代互联网时代&#xff0c;电子商务已经成为了经济发展的重要推动力之一。越来越多的企业和个人开始通过电商平台进行商品销售&#xff0c;而准确的数据分析和及时的数据更新成为了他们的关键需求。而电商数据API接口&#xff0c;作为电商平台和第三方开发者之间的桥梁&…

星河双子塔对面万科星火城市更新规划出炉

龙岗区坂田街道欧威尔空调厂城市更新单元“工业上楼”项目规划&#xff08;草案&#xff09;已经龙岗区“工业上楼”项目工作专班2023年第四次审批会议审议通过。根据《中华人民共和国城乡规划法》《深圳经济特区城市更新条例》《深圳市城市更新办法实施细则》《深圳市“工业上…

手动创建一个DOCKER镜像

1. 我们先使用C语言写一个hello-world程序 vim hello.c # include <stdio.h>int main() {print("hello docker\n"); } 2. 将hello.c文件编译成二进制文件, 需要安装工具 yum install gcc yum install glibc-static 开始编译 gcc -static hello.c -o hello 编译…

600V EasyPIM™ IGBT模块FB30R06W1E3、FB20R06W1E3B11、FB20R06W1E3降低了系统成本和损耗,可满足高能效要求。

EasyPIM™ IGBT模块是一种三相输入整流器PIM IGBT模块&#xff0c;采用TRENCHSTOP™ IGBT7、发射器控制7二极管和NTC/PressFIT技术。该模块具有增强的dv/dt可控性、改进的FWD软度、优化的开关损耗以及8μs短路稳定性。EasyPIM&#xff08;功率集成模块&#xff09;外形非常小巧…

python工具库有哪些,python工具包怎么用

大家好&#xff0c;小编来为大家解答以下问题&#xff0c;python工具包有哪些&#xff0c;python工具包怎么用&#xff0c;现在让我们一起来看看吧&#xff01; 最近有多位读者留言&#xff0c;咨询更便捷、高效的python编程开发工具&#xff08;IDE&#xff09;&#xff0c;本…

词性标记:隐马尔可夫模型简介(1/2)

一、说明 作为人类&#xff0c;我们比这个星球上的任何动物都更了解自然语言的许多细微差别。比如说&#xff1a;“你吃了吗”&#xff0c;“企业吃不饱”&#xff0c;“吃豆腐”&#xff0c;“吃醋了”&#xff1b;同样一个“吃”&#xff0c;意义不同&#xff0c;从一个符号出…

tsmc12 加tap cell/boundary cell失败原因总结

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?拾陆楼知识星球入口 via0_grid tsmc12有via0的概念,boundary cell不需要对齐via0,但tap cell的pg pin是有via0这一层的,所以当tap cell添加失败,首先需要检查的就是via0_grid是否创建成功,offset能否对齐via0。 …

【低代码预研】通过低代码平台开发应用程序

目录 低代码介绍 预研目标 预研产品 1. 业务流程 2. 用户权限 3. 统计图表 4. 大屏设计 5. 第三方登录 6. 分布式调度 小结 近几年&#xff0c;一直对低代码平台有所耳闻&#xff0c;目前已经对低代码平台有了一定的认识&#xff0c;如果能通过一个可视化的配置页面就能完成前端…

今天我会带你了解音频转文字怎么弄的

常常被老板的“长”会议限制住了怎么办&#xff1f;当然这里的“长”是指时长。 老板的唠叨话不是一两个小时能讲完的&#xff0c;而且还需要你将会议心得整理给他&#xff0c;你可以受得吗&#xff1f; 我经常遇到这种情况&#xff0c;都习以为常了&#xff0c;因为我找到应…

Microsoft SQL Server 2008中,语法生成错误“并行数据仓库(PDW)功能未启用“(已解决)

案例&#xff1a; 原表有两列&#xff0c;分别为月份、月份销售额&#xff0c;而需要一条 SQL 语句实现统计出每个月份以及当前月以前月份销售额和 sql 测试数据准备&#xff1a; DECLARE Temp Table ( monthNo INT, --- 月份 MoneyData Float --- 金额 ) insert INTO TEM…