C. The Labyrinth

题目连接:

http://www.codeforces.com/contest/616/problem/C

Description

You are given a rectangular field of n × m cells. Each cell is either empty or impassable (contains an obstacle). Empty cells are marked with '.', impassable cells are marked with '*'. Let's call two empty cells adjacent if they share a side.

Let's call a connected component any non-extendible set of cells such that any two of them are connected by the path of adjacent cells. It is a typical well-known definition of a connected component.

For each impassable cell (x, y) imagine that it is an empty cell (all other cells remain unchanged) and find the size (the number of cells) of the connected component which contains (x, y). You should do it for each impassable cell independently.

The answer should be printed as a matrix with n rows and m columns. The j-th symbol of the i-th row should be "." if the cell is empty at the start. Otherwise the j-th symbol of the i-th row should contain the only digit —- the answer modulo 10. The matrix should be printed without any spaces.

To make your output faster it is recommended to build the output as an array of n strings having length m and print it as a sequence of lines. It will be much faster than writing character-by-character.

As input/output can reach huge size it is recommended to use fast input/output methods: for example, prefer to use scanf/printf instead of cin/cout in C++, prefer to use BufferedReader/PrintWriter instead of Scanner/System.out in Java.

input

The first line contains two integers n, m (1 ≤ n, m ≤ 1000) — the number of rows and columns in the field.

Each of the next n lines contains m symbols: "." for empty cells, "*" for impassable cells.

Output

Print the answer as a matrix as described above. See the examples to precise the format of the output.

Sample Input

3 3

.

.*.

.

Sample Output

3.3

.5.

3.3

Hint

题意

给你n行m列的矩阵,矩阵*表示障碍,.表示空地

对于每一个障碍,让你输出去掉这个障碍之后,这个点所在的连通块的大小是多少

答案需要%10

题解:

这个块的联通块大小,实际上是由四个部分所组成的

上下左右的连通块加在一起就好了

但是有一个问题,就是你有可能加重复,所以我们需要有个vis处理

处理原来连通块,我是用的带权并查集去做的

dfs和bfs应该都可以,因为复杂度都是差不多的(其实应该比并查集还低

代码

#include<bits/stdc++.h>
using namespace std; char s[1150][1150];
int fa[1010050];
int num[1100500];
int v[1010050];
int n,m;
int id(int x,int y)
{
return x*m+y;
}
int fi(int x)
{
return x == fa[x]?x:fa[x]=fi(fa[x]);
}
int uni(int x,int y)
{
int p = fi(x),q = fi(y);
if(p != q)
{
fa[p]=fa[q];
num[q]=num[p]+num[q];
num[p]=0;
}
}
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int main()
{ scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%s",s[i]+1);
for(int i=0;i<=id(n,m)+5;i++)
num[i]=1,fa[i]=i;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s[i][j]=='*')continue;
for(int k=0;k<4;k++)
{
int x = i + dx[k];
int y = j + dy[k];
if(x<1||x>n||y<1||y>m)continue;
if(s[x][y]=='*')continue;
uni(id(x,y),id(i,j));
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(s[i][j]=='.')
printf(".");
else
{
int ans = 1;
for(int k=0;k<4;k++)
{
int x = i + dx[k];
int y = j + dy[k];
if(x<1||x>n||y<1||y>m)continue;
if(s[x][y]=='*')continue;
int idx = fi(id(x,y));
if(v[idx]==0)
{
v[idx]=1;
ans+=num[idx];
}
}
printf("%d",ans%10);
for(int k=0;k<4;k++)
{
int x = i + dx[k];
int y = j + dy[k];
if(x<1||x>n||y<1||y>m)continue;
if(s[x][y]=='*')continue;
int idx = fi(id(x,y));
v[idx]=0;
}
}
}
printf("\n");
}
}

Codeforces Educational Codeforces Round 5 C. The Labyrinth 带权并查集的更多相关文章

  1. Codeforces Round #181 (Div. 2) B. Coach 带权并查集

    B. Coach 题目连接: http://www.codeforces.com/contest/300/problem/A Description A programming coach has n ...

  2. Codeforces 1499G - Graph Coloring(带权并查集+欧拉回路)

    Codeforces 题面传送门 & 洛谷题面传送门 一道非常神仙的题 %%%%%%%%%%%% 首先看到这样的设问,做题数量多一点的同学不难想到这个题.事实上对于此题而言,题面中那个&quo ...

  3. Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C. Destroying Array 带权并查集

    C. Destroying Array 题目连接: http://codeforces.com/contest/722/problem/C Description You are given an a ...

  4. Valentine's Day Round hdu 5176 The Experience of Love [好题 带权并查集 unsigned long long]

    传送门 The Experience of Love Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Ja ...

  5. codeforces 687D Dividing Kingdom II 带权并查集(dsu)

    题意:给你m条边,每条边有一个权值,每次询问只保留编号l到r的边,让你把这个图分成两部分 一个方案的耗费是当前符合条件的边的最大权值(符合条件的边指两段点都在一个部分),问你如何分,可以让耗费最小 分 ...

  6. CodeForces - 688C:NP-Hard Problem (二分图&带权并查集)

    Recently, Pari and Arya did some research about NP-Hard problems and they found the minimum vertex c ...

  7. CodeForces - 687D: Dividing Kingdom II (二分图&带权并查集)

    Long time ago, there was a great kingdom and it was being ruled by The Great Arya and Pari The Great ...

  8. Codeforces 1156D 带权并查集

    题意:给你一颗树,树边的权值可能是0或1,问先走0边,再走1边,或者只走1边的路径有多少条? 思路:对于一个点,假设通过0边相连的点一共有x个(包括自己),通过1边相连的有y个(包括自己),那么对答案 ...

  9. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...

随机推荐

  1. Hadoop 2 初探

    Hadoop 2.6.0的安装略复杂,在一台既有Hadoop 1又有Hadoop 2的server上,要设置好环境变量,必要时候echo $HADOOP_HOME一下看运行的是哪个版本. Master ...

  2. 大数据时代的数据存储,非关系型数据库MongoDB

    在过去的很长一段时间中,关系型数据库(Relational Database Management System)一直是最主流的数据库解决方案,他运用真实世界中事物与关系来解释数据库中抽象的数据架构. ...

  3. jqueryMobile

    <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...

  4. 服务器进程为何通常fork()两次

    首先,要了解什么叫僵尸进程,什么叫孤儿进程,以及服务器进程运行所需要的一些条件.两次fork()就是为了解决这些相关的问题而出现的一种编程方法. 孤儿进程 孤儿进程是指父进程在子进程结束之前死亡(re ...

  5. 安装phonegap

    1.安装nodejs http://nodejs.org/ 2.安装git www.git-scm.com/download 3.安装jdk http://www.oracle.com/technet ...

  6. cocos2d-html5将js编译为jsc

    在d:\DevTool\cocos2d-x-2.2.2\cocos2d-x-2.2.2\tools\cocos2d-console\console 有 cocos2d_jscompile.py coc ...

  7. 使用IIS6.0遇到问题后,常用的几种解决方法

    1.检查 .Net Framework,是否安装完全,不确定的情况下使用:aspnet_regiis.exe -i 或者 aspnet_regiis.exe -r 2.检查 IIS 6.0 其它相关配 ...

  8. to_number,Extract oracle的关键字

    to_number(Extract(year from 字段名)) 简介:获取时间字段的年份后转换为数字

  9. 如何检查oracle的归档空间是否满了?

    如何检查oracle的归档空间是否满了? 关于如何检查归档空间是否慢了,大多数人会去先检查放归档的目录的磁盘空间是否满了,通过该归档目录空余情况来判断归档空间是否满了,但我觉得这个方法不一定代表实际情 ...

  10. POJ2155Matrix(二维线段树)

    链接http://poj.org/problem?id=2155 题目操作就是说,每次操作可以是编辑某个矩形区域,这个区域的0改为1,1改为0,每次查询只查询某一个点的值是0还是1. 方法:二维线段树 ...