AtCoder Beginner Contest 277 F. Sorting a Matrix(拓扑排序+虚点)

news2025/2/22 23:50:53

题目

n*m(2<=n,m<=1e6,n*m<=1e6)的矩阵,

第i行第j列元素a[i][j](0<=a[i][j]<=n*m)

对于值为0的元素,你可以将其赋值为任意正整数,

不同位置的0元素,可以被赋值成不同的正整数

然后,你可以执行以下操作若干次:

1. 选择行i和行j,对于k∈[1,m],交换a[i][k]和a[j][k]

2. 选择列i和列j,对于k∈[1,n],交换a[k][i]和a[k][j]

若干次操作后,问矩阵是否能满足以下条件:

  • A1,1​≤A1,2​≤⋯≤A1,W​≤A2,1​≤A2,2​≤⋯≤A2,W​≤A3,1​≤⋯≤AH,1​≤AH,2​≤⋯≤AH,W​

即每一行行内非严格递增,且第i行的最大值不超过第i+1的最大值

思路来源

官方题解

题解

首先,0是可以被忽略的,假设在一个非严格递增序列中插入0,

则0总可以赋值成其相邻左侧,或相邻右侧的值,使得序列的非严格递增性质保持不变

然后,矩阵会有一个行限制和一个列限制

1. 行限制,记每一行的最小值和最大值(mn,mx),然后按mn排增序,

则排增序之后,第i项的mx需要小于等于第i+1项的mn

2. 列限制,行操作完之后,每次只能交换两列,若干次操作后,

相当于找到一个列号的排列,使得每一行内成非严格递增

对于同一行不同列内的两个值来说,若j1列的值v1<j2列的值v2,则列j1需要在列j2左侧

连一条边之后,相当于需要对m列确定一个拓扑序,

但如果对每一行暴力连边,一行内的边数最多是C(m,2)的,总数n*C(m,2),不能接受

假设有两列的值是1,两列的值是2,考虑按如下图示,优化建边数

优化后,总的点数大致在2e6级别,而边数也大致在4e6级别,直接topo排序即可

图示

暴力连边

 建虚点x连边

心得

虚点的做法,典中典

之前只是在最短路中搞过虚点,实际这题说明,

需要连n*m条边的场合,都可以考虑尝试是不是能优化成n+m条边的

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> P;
const int N=2e6+10,INF=0x3f3f3f3f;
int n,m,in[N],tot,id;
P b[N],x[N];
vector<int>e[N];
queue<int>q;
void add(int u,int v){
    e[u].push_back(v);
    in[v]++;
}
int main(){
	scanf("%d%d",&n,&m);
	vector<vector<int>>a(n+1,vector<int>(m+1,0));
    id=m;
	for(int i=0;i<n;++i){
		int c=0,cnt=0,mn=N,mx=0;
		for(int j=0;j<m;++j){
			scanf("%d",&a[i][j]);
			cnt+=(!a[i][j]);
			if(a[i][j]){
				x[c++]=P(a[i][j],j);
				mn=min(mn,a[i][j]);
				mx=max(mx,a[i][j]);
			}
		}
        if(cnt==m)continue;
		b[tot++]=P(mn,mx);
		sort(x,x+c);// 列限制
        int las=-1;
        for(int j=0;j<c;){
            int k=j;
            while(k+1<c && x[k+1].first==x[k].first)k++;
            if(~las)for(int l=j;l<=k;++l)add(las,x[l].second);
            las=id++;
            for(int l=j;l<=k;++l)add(x[l].second,las);
            j=k+1;
        }
	}
    sort(b,b+tot);// 行限制
    for(int i=1;i<tot;++i){
        if(b[i-1].second>b[i].first){
            cout<<"No"<<endl;
            return 0;
        }
    }
    for(int i=0;i<id;++i){
        if(!in[i])q.push(i);
    }
    while(!q.empty()){
        int u=q.front();q.pop();
        id--;
        for(auto &v:e[u]){
            if(!(--in[v])){
                q.push(v);
            }
        }
    }
	cout<<(!id?"Yes":"No")<<endl;
	return 0;
}

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

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

相关文章

firefly3399 移植linux5.15.80 - 2022-11-27

需要注意的是&#xff0c;虚拟机需要足够的硬盘空间&#xff0c;不小于15GB&#xff01;&#xff01; 一、内核源码下载 国内镜像地址 git clone https://kernel.source.codeaurora.cn/pub/scm/linux/kernel/git/stable/linux.git/ 基本达到了带宽的最大值。 国外地址&#…

Android使用AudioTrack播放WAV音频文件

目录 1、wav文件格式 2、wav文件解析 3、wav文件播放 QA&#xff1a; 开始播放wav的时候使用了系统的播放器mediaplayer进行播放&#xff0c;但是无奈mediaplayer支持的实在不好。 好些年前自己做过pcm播放使用的是audiotrack&#xff0c;参考&#xff1a;CSDN 其实两者之…

php 进程池设计与实现,phper必学!

php 进程池设计与实现phper 为什么要学习进程池池的概念为什么要有进程池?动态创建进程缺点进程池的优点选择子进程为新任务服务的方式进程池模型服务端客户端结语phper 为什么要学习进程池 在php开发过程中经常使用的 php-fpm 使用的进程模型就是进程池&#xff0c;学习进程…

如何基于FSM有限状态机实现Enemies AI

文章目录&#x1f35f; Preface&#x1f355; 巡逻状态&#x1f37f; 寻路状态&#x1f32d; 攻击状态&#x1f357; 完整代码&#x1f35f; Preface 本文简单介绍如何基于FSM有限状态机实现Enemies AI&#xff0c;首先定义敌人的AI逻辑&#xff1a;默认状态下Enemy为巡逻状态…

刷爆力扣之等价多米诺骨牌对的数量

刷爆力扣之等价多米诺骨牌对的数量 HELLO&#xff0c;各位看官大大好&#xff0c;我是阿呆 &#x1f648;&#x1f648;&#x1f648; 今天阿呆继续记录下力扣刷题过程&#xff0c;收录在专栏算法中 &#x1f61c;&#x1f61c;&#x1f61c; 该专栏按照不同类别标签进行刷题&…

使用 nlohmann 解析 json 文件

使用 nlohmann 解析 json 文件nlohmann/json的配置json基本数据结构json文件的读取、构造与输出C对象与nlohmann::json对象的转换C对象转换成nlohmann::json对象nlohmann::json对象转换成C对象序列化反序列化序列化nlohmann 是德国工程师&#xff0c;以其名字为工程名的 nlohm…

springboot项目的打包发布部署,jar和war的区别

简介&#xff1a; 1.Spring Boot使用了内嵌容器&#xff0c;因此它的部署方式也变得非常简单灵活&#xff0c;可以将Spring Boot项目打包成JAR包来独立运行&#xff0c;也可以打包成WAR包部署到Tomcat容器中运行&#xff0c;如果涉及大规模的部署&#xff0c;Jenkins成为最佳选…

【HCIP-Datacom】 IS-IS基础 ISIS动态路由协议配置(ISIS思维导图在底部)

目录 ISIS配置方法&#xff1a; 路由计算&#xff1a; ATT置位条件&#xff1a; 路由渗透&#xff1a; ISIS的认证&#xff1a; ISIS配置命令&#xff1a; ISIS的开销类型&#xff1a; ISIS配置方法&#xff1a; 进入ISIS进程 isis 1 //创建isis进程 设置实体名 network-entit…

.NET 升级发布后,IIS出现了System.IO.DirectoryNotFoundException

最近计划升级项目到.NET6, 在使用Release发布后发现IIS不能发现wwwroot目录,什么错误? 📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:无尽的折腾后,终于又回到了起点,工控,我来了 !1 发布的一…

《统计学习方法》 第十六章 主成分分析PCA

主成分分析(PCA) 假设xxx为mmm 维随机变量&#xff0c;其均值为μ\muμ&#xff0c;协方差矩阵为Σ\SigmaΣ 考虑由mmm维随机变量xxx到mmm维随机变量yyy的线性变换 yiαiTx∑k1mαkixk,i1,2,⋯,my _ { i } \alpha _ { i } ^ { T } x \sum _ { k 1 } ^ { m } \alpha _ { k …

计算点在线上的投影坐标

如题 计算点到线上的垂点&#xff0c;首先明确&#xff1a; 该线段必须给出确切的起始点和终点&#xff0c; 而不是一个向量&#xff0c;因为一个向量并不能代表一个线段。 所以参数列表如下&#xff1a; Vector3 VerticalPoint(Vector3 point, Vector3 lStart, Vector3 lEnd…

【论文翻译】增强复制状态机的两阶段提交协议

Enhancing Two Phase-Commit Protocol for Replicated State Machines Halit Uyanık and Tolga Ovatman Department of Computer Engineering Istanbul Technical University 34469 Istanbul, Turkey Email目录1 介绍2 设计和实现2.1 事件类型2.2 在状态机上执行事件2.3 具有优…

8、常用基本命令(重要)

文章目录8、常用基本命令&#xff08;重要&#xff09;8.1 帮助命令8.1.1 man 获得帮助信息8.1.2 help 获得 shell 内置命令的帮助信息8.1.3 常用快捷键8.2 文件目录类8.2.1 pwd 显示当前工作目录的绝对路径8.2.2 ls 列出目录的内容8.2.3 cd 切换目录8.2.4 mkdir 创建一个新的目…

Linux驱动入门

一、驱动简介 Linux的驱动在本质上就是一种软件程序&#xff0c;上层软件可以在不了解硬件特性的情况下&#xff0c;通过驱动提供的接口&#xff0c;和计算机硬件进行通信。 系统调用是内核和应用程序之间的接口&#xff0c;而驱动程序是内核和硬件之间的接口。它为应用程序屏蔽…

缓存穿透、缓存击穿、缓存雪崩及其解决方案

缓存&#xff08;cache&#xff09;&#xff0c;大家都非常熟悉&#xff0c;几乎每个系统乃至整个计算机体系中都会用到。在分布式系统架构中&#xff0c;主要用于减轻数据库的压力&#xff0c;提高系统的响应速度和并发吞吐&#xff0c;即空间(内存)换时间。当大量的读、写请求…

【模型推理加速系列】06: 基于resnet18加速方案评测

简介 花雪随风不厌看&#xff0c;更多还肯失林峦。愁人正在书窗下&#xff0c;一片飞来一片寒。小伙伴们好&#xff0c;我是微信公众号小窗幽记机器学习的首席称重师&#xff1a;卖麻辣烫的小男孩。今天这篇文章以resnet18模型为例&#xff0c;对比Pytorch、ONNX、TorchScript…

cmdline(二):uboot cmdline怎么传?cmdline kernel怎么用?

前面我们知道了cmdline是什么&#xff0c;已经在哪里添加cmdline&#xff1f;现在我们来看看在哪里传输cmdline&#xff0c;以及传输收到后怎么用&#xff1f; 参考内容来自前辈&#xff0c;感激&#xff1a; https://blog.csdn.net/weixin_42031299/article/details/12123950…

Spring Boot JPA EntityManager实体管理器示例

在本教程中&#xff0c;您将了解如何在 Spring Boot 示例中使用 JPA EntityManager&#xff08;使用 CRUD 操作和查询方法&#xff09;。我将向您展示&#xff1a; 在 Spring 引导中访问 JPA 实体管理器的方法如何使用实体管理器方法&#xff1a;执行SQL查询使用和CRUD操作cre…

【Android App】实现在线语音合成功能(使用云知声平台和WebSocket 超详细 附源码)

需要源码和Jar包请点赞关注收藏后评论区留下QQ~~~ 一、在线语音合成 虽然国产智能机大多集成了中文语音引擎&#xff0c;但是系统自带的语音工具无法满足商用要求&#xff0c;功能单一&#xff0c;所以势必引入第三方的语音引擎&#xff0c;依靠第三方提供的开发包统一支撑语音…

【新知实验室】——腾讯云音视频TRTC体验

腾讯实时音视频 TRTC 是什么&#xff1f; 腾讯实时音视频&#xff08;Tencent Real-Time Communication&#xff0c;TRTC&#xff09;将腾讯21年来在网络与音视频技术上的深度积累&#xff0c;以多人音视频通话和低延时互动直播两大场景化方案&#xff0c;通过腾讯云服务向开发…