codeforces 884E Binary Matrix 并查集,滚动数组

E. Binary Matrix
time limit per test
3 seconds
memory limit per test
16 megabytes
input
standard input
output
standard output

You are given a matrix of size n × m. Each element of the matrix is either 1 or 0. You have to determine the number of connected components consisting of 1's. Two cells belong to the same component if they have a common border, and both elements in these cells are 1's.

Note that the memory limit is unusual!

Input

The first line contains two numbers n and m (1 ≤ n ≤ 2124 ≤ m ≤ 214) — the number of rows and columns, respectively. It is guaranteed that m is divisible by 4.

Then the representation of matrix follows. Each of n next lines contains  one-digit hexadecimal numbers (that is, these numbers can be represented either as digits from 0 to 9 or as uppercase Latin letters from A to F). Binary representation of each of these numbers denotes next 4 elements of the matrix in the corresponding row. For example, if the number B is given, then the corresponding elements are 1011, and if the number is 5, then the corresponding elements are 0101.

Elements are not separated by whitespaces.

Output

Print the number of connected components consisting of 1's.

题意:

超大矩阵超小内存求联通块数量。

题解:

按行扫描,保留上一行的状态以及上一行的并查集。

扫描到第i行时候,把第i行值为1且相邻的元素加入到并查集中去。

然后根据上一行的并查集,把第i行与上一行都为1且上下相邻的元素以上一行的元素的father点为标志,做一个等价类(等价类中包含的元素全都是第i行的)。

等价类中的元素意义是他们都可以通过i-1行进行互联,然后把他们加入到并查集里面去。

然后新的一行的并查集就建立完成了。

把新的并查集和旧的并查集交换,这样一直做下去。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
const int maxn = (1<<14)+10;
int n,m;
long long ans = 0;
bool *line0,*line1;
int mark[maxn];
int *parents[2];
int group[maxn];
P stk[maxn];
int top;
inline int find(int *parent,int x){return parent[x] = x == parent[x]?x:find(parent,parent[x]);
}
inline void join(int *parent,int x,int y){int p1 = find(parent,x),p2 = find(parent,y);if(p1 == p2) return;parent[p1] = p2;
}
void initp(int *parent){for(int i = 0;i < maxn;++i) parent[i] = i;
}
int main(){ios_base::sync_with_stdio(0);cin.tie(0);string s;parents[0] = new int[maxn];parents[1] = new int[maxn];line1 = new bool[maxn];line0 = new bool[maxn];memset(line0,0,maxn*sizeof(bool));memset(line1,0,maxn*sizeof(bool));initp(parents[0]); cin>>n>>m;//n = 4096,m = 16384;for(int i = 1;i <= n+1;++i){memset(line0,0,maxn*sizeof(bool));memset(group,-1,sizeof(group));memset(mark,0,sizeof(mark));top = 0;if(i <= n){cin>>s;for(int j = m/4-1;j >= 0;j--){char c;c = s[m/4-1-j];//c = 'F';int num = c<='9'?c-'0':c-'A'+10;line0[4*j+0] = num&1;line0[4*j+1] = (num>>1)&1;line0[4*j+2] = (num>>2)&1;line0[4*j+3] = (num>>3)&1;}}for(int j = 0;j < m;++j){if(line1[j] && line0[j]) mark[find(parents[0],j)] = 1;}for(int j = 0;j < m;++j){if(line1[j] && !mark[find(parents[0],j)]){ans++;mark[find(parents[0],j)] = 1;}}initp(parents[1]);for(int j = 0;j < m;++j) if(line0[j] && line1[j]){int gp = find(parents[0],j);if(group[gp] == -1) group[gp] = j;else join(parents[1],group[gp],j),group[gp] = j;}for(int j = 0;j < m-1;j++){if(line0[j] && line0[j+1]) join(parents[1],j,j+1);}swap(line1,line0);swap(parents[0],parents[1]);}cout << ans << endl;return 0;
} 




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

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

相关文章

使用ILSpy探索C#7.0新增功能点

第一部分&#xff1a;C&#xff03;是一种通用的&#xff0c;类型安全的&#xff0c;面向对象的编程语言。有如下特点&#xff1a;&#xff08;1&#xff09;面向对象&#xff1a;c# 是面向对象的范例的一个丰富实现, 它包括封装、继承和多态性。C#面向对象的行为包括&#xff…

【动态规划】叠放箱子问题(ssl 1640)

叠放箱子问题叠放箱子问题叠放箱子问题 Description 某港口有一批集装箱&#xff0c;将其编号&#xff0c;分别为1至N。每一个箱子的外型尺寸都是一样的&#xff0c;现在要将其中某些集装箱叠放起来&#xff0c;集装箱叠放的规则如下&#xff1a; 1)每个集装箱上最多只能直接…

Ubuntu 16.04+.Net Core+Docker+Nginx安装部署

前言最近公司的项目打算移植到.Net Core平台&#xff0c;所以调研了一下.Net Core在Linux下的安装部署。本篇文章会一步步的描述从安装到配置到部署的全部过程。在文章的结构和内容里&#xff0c;笔者借鉴了很多其他博文的内容&#xff0c;但感觉其他博文中都只是实现了一部分或…

玩Docker只要浏览器就够了,PWD是个神奇的网站

本文是d4d系列的第9篇&#xff0c;在这一篇中给大家介绍一个学习Docker最为快捷高效的方式&#xff0c;你不需要自己搭建环境&#xff0c;也不用担心把自己的开发环境搞乱&#xff0c;你需要的只是一个浏览器&#xff0c;就可以立即开始学习Docker的常用命令&#xff1b;你甚至…

[系统安全]使用OD编写连连看外挂

文档下载地址&#xff1a;https://pan.baidu.com/s/1hrzzerq

2018 .NET开发者调查报告: .NET Core 是怎么样的状态

4月28日&#xff0c;在公众号里发起《.NET Core 使用调查》&#xff0c;该调查为期一周&#xff0c;有近3300名开发者参与&#xff0c;统计下结果供你的决策参考。已经使用.net core 的人数只有44%&#xff0c;计划使用.net core 比例达到48%&#xff0c; 没有计划去使用.net …

软件质量保证划重点期末复习总结

软件质量保证复习总结大纲及问题 Module1 《软件工程实践》 1、软件工程实践通过解决问题的根源来指导软件开发。 2、软件工程实践之间相辅相成。 3、过程指导一个团队在什么时候做什么以及如何做。 4、软件工程过程为实现软件工程实践提供了上下文和支持。 Module2 《软件…

Microsoft Build 2018 直播来啦!

一年一度的Microsoft Build大会又来啦&#xff01;Microsoft Build是微软面向全球开发者、合作伙伴以及消费者介绍其重要产品在未来一年内发展方向的技术盛会。而今年的Microsoft Build 2018大会是微软巨大蜕变、最彻底组织变革后的第一次前沿技术大会。更多了解&#xff0c;请…

【动态规划】矩阵链相乘 (ssl 1596)/能量项链 (ssl 2006)

矩阵链相乘{\color{Cyan} 矩阵链相乘 }矩阵链相乘 Description Input n表示矩阵的个数(<100) n1个数,表示矩阵(<100) Output 最小的乘法次数 Sample Input 5 5 10 4 6 10 2 Sample Output 348 题目大意&#xff1a; 有n个矩阵&#xff0c;输入n1个数&#x…

10、mybatis中缓存的使用

对于初学者&#xff0c;如何进行mybatis的学习呢&#xff1f;我总结了几点&#xff0c;会慢慢的更新出来。首先大家需要了解mybatis是什么、用mybatis来做什么、为什么要用mybatis、有什么优缺点&#xff1b;当知道了为什么的时候就开始了解如何用的问题&#xff0c;如何使用my…

C#编译器优化那点事

使用C#编写程序&#xff0c;给最终用户的程序&#xff0c;是需要使用release配置的&#xff0c;而release配置和debug配置&#xff0c;有一个关键区别&#xff0c;就是release的编译器优化默认是启用的。优化代码开关即optimize开关&#xff0c;和debug开关一起&#xff0c;有以…

如何在Visual Studio 2017中使用C# 7+语法

前言之前不知看过哪位前辈的博文有点印象C# 7控制台开始支持执行异步方法&#xff0c;然后闲来无事&#xff0c;搞着&#xff0c;搞着没搞出来&#xff0c;然后就写了这篇博文&#xff0c;不喜勿喷&#xff0c;或许对您有帮助。在Visual Studio 2017配置支持C# 7语法心想都VS20…

11、mybatis的功能架构分析

1、Mybatis功能架构 1&#xff09;API接口层&#xff1a;提供给外部使用的接口API&#xff0c;开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。 2&#xff09;数据处理层&#xff1a;负责具体的SQL查找、SQL解析、SQL执…

【动态规划】方格取数 (ssl 1010)

方格取数方格取数方格取数 Description 设有N*N的方格图(N<10,我们将其中的某些方格中填入正整数,而其他的方格中则放入数字0。如下图所示&#xff08;见样例&#xff09;&#xff1a; 某人从图的左上角的A 点出发&#xff0c;可以向下行走&#xff0c;也可以向右走&#…

ASP.NET Core 使用UrlFirewall对请求进行过滤

一. 前言UrlFirewall 是一个开源、轻便的对http请求进行过滤的中间件&#xff0c;可使用在webapi或者网关&#xff08;比如Ocelot&#xff09;,由我本人编写&#xff0c;并且开源在github&#xff1a;https://github.com/stulzq/UrlFirewall 欢迎star.二.UrlFirewall 介绍UrlFi…

1、设计模式和原则总述

目录 一、什么是设计模式&#xff1f;有什么用&#xff1f; 二、设计模式 三、设计原则 一、什么是设计模式&#xff1f;有什么用&#xff1f; 设计模式是一套代码设计的经验总结&#xff0c;使用设计模式可以提高代码的重用性、可靠性&#xff0c;提交代码内聚&#xff0c;降…

Visual Studio 15.7预览版4改进Git、C++支持

对于即将到来的Visual Studio 2017 15.7&#xff0c;微软已经发布了多个新的预览版本。这些版本的变更很有限&#xff0c;似乎离正式发布不远了。通常&#xff0c;变更的涉及面很广——因此&#xff0c;不管是用什么语言&#xff0c;开发人员都可以看到一些好处。第一次&#x…

P2827-蚯蚓【队列】

前言 早年一直拿堆过不了&#xff0c;结果发现要用队列 正题 题目链接:https://www.luogu.com.cn/problem/P2827 题目大意 有nnn条蚯蚓&#xff0c;每次选取最长的一条&#xff0c;切成⌊x∗p⌋\lfloor x*p\rfloor⌊x∗p⌋和x−⌊x∗p⌋x-\lfloor x*p\rfloorx−⌊x∗p⌋的两…

.net core DI 注册 Lazy 类型

当我们在 .net core (2.1) 中运行如下代码注入 Lazy<T> 变量的时候&#xff1a;public AccountService(Lazy<IHttpContextAccessor> httpContextAccessor) { }可能会遇到这样的错误提示&#xff1a;InvalidOperationException: Unable to resolve service for type…

【深搜】 棋盘 【NOIp普及组 2017 第三题】 (luogu 3956/ssl 2851)

棋盘棋盘棋盘 题目大意&#xff1a; 有一个M*M的棋盘&#xff0c;要从&#xff08;1&#xff0c;1&#xff09;到&#xff08;m,m&#xff09;&#xff0c;中间有n个有颜色的格子&#xff0c;只能踩在有颜色的格子上&#xff0c;跳到不同颜色的格子要花费1元&#xff0c;可以将…