2372: 连通块(blocks) 个人认为二维并查集为什么TLE?_Modiz的博客-程序员资料

技术标签: 二维并查集  数据结构  未解之谜  

题目链接:http://acm.upc.edu.cn/problem.php?id=2372

2372: 连通块(blocks)

Time Limit: 1 Sec   Memory Limit: 64 MB
Submit: 37   Solved: 5
[ Submit][ Status][ Web Board]

Description

为了增强幼儿园小朋友的数数能力,小虎的老师给了一个家庭游戏作业。他让小虎拿一块空的围棋盘,随机地在一些方格中放些棋子(有黑白两种颜色),如果一个方格和它的上、下、左、右四个方格之一都有相同颜色的棋子,则认为两格子是相连通的。这期间,要求小虎不断统计共有多少个连通块。
如下图是一个5×9的棋盘,其中“.”表示空格,“*”表示黑棋子,“@”表示白棋子。则有4块连通的棋子块。
.........
..**..@..
.**@@.@@.
..*@..*..
.........

哥哥大虎在一边看一边想,如果棋盘是N×N的,共放了M个棋子,如何用计算机解决这个问题呢?

Input

第1行两个整数:N,m(1≤N≤500,l≤M≤N×N)。
接下来有M行,,每行三个正整数:C,X,Y(0≤C≤1,l≤X,Y≤N),分别表示依次放入棋子的颜色(0表示白色,1表示黑色)、要放入格子的横坐标和格子的纵坐标。

Output

共M行。第i行一个整数,表示放入第i个棋子后,当前有多少个棋子连通块。

Sample Input

3 5
1 1 1
1 1 2
0 2 2
1 3 1
1 2 1

Sample Output

1
1
2
3
2

HINT

我的想法是,二维并查集,把连成一片的棋子并在一起,下一次判断的时候只需要看是否存在同一个根,是则不需要加,不是则+。可是TLE了。

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
#include <map>
#include <stack>
#include <list>
#include <vector>
using namespace std;
struct node
{
	int x,y,c;
	bool operator ==(node a)
	{
		if (a.x==x && a.y==y) 	
			return 1;
		else return 0;
	}
}f[520][520],t[500*501];
int dir[4][2]={
   {-1,0},{0,1},{1,0},{0,-1}};
node find(int x,int y)
{
	if (x==f[x][y].x && y==f[x][y].y)
		return f[x][y];
	else return f[x][y]=find(f[x][y].x,f[x][y].y);
}
int main()
{
	int n,m,i,j,c,a,b;
	while (~scanf("%d%d",&n,&m))
	{
	/*	for (i=0;i<=n+1;i++)
			for (j=0;j<=n+1;j++)
			{
				f[i][j].x=i;
				f[i][j].y=j;
				f[i][j].c=2;
			}*/
		memset(f,-1,sizeof(f));
		int ans=0;
		for (i=1;i<=m;i++)
		{
			scanf("%d%d%d",&c,&a,&b);
			ans++;
			t[i].x=a;
			t[i].y=b;
			f[a][b].x=a;
			f[a][b].y=b;
			f[a][b].c=c;
			for (j=0;j<4;j++)
			{
				if (f[a+dir[j][0]][b+dir[j][1]].c==f[a][b].c)
				{
					node k1=find(a+dir[j][0],b+dir[j][1]);
					node k2=find(a,b);
					if (k1==k2) continue;
					else
					{
						ans--;
						f[k1.x][k1.y].x=k2.x;
						f[k1.x][k1.y].y=k2.y;
					}
				}
			}
			cout<<ans<<endl;
		}
	}
	return 0;
}

又提交了一发DFS搜索,还是TLE!!!这是要虐我千百遍吗?

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <queue>
#include <map>
#include <stack>
#include <list>
#include <vector>
using namespace std;
int xx[4]={-1,1,0,0};
int yy[4]={0,0,-1,1};
int vis[520][520],mp[520][520],n,m;
int check(int x,int y,int t)
{
	if (x<1 || x>n || y<1 || y>n || mp[x][y]!=t || vis[x][y]==1)
		return 0;
	return 1;
}
void DFS(int x,int y,int t)
{
	for (int i=0;i<4;i++)
	{
		int x1=x+xx[i];
		int y1=y+yy[i];
		if (check(x1,y1,t))
		{
			vis[x1][y1]=1;
			DFS(x1,y1,t);
		}
	}
}
int main()
{
	int i,a,c,b,j,k;
	while (~scanf("%d%d",&n,&m))
	{
		memset(mp,0,sizeof(mp));
		for (i=1;i<=m;i++)
		{
			scanf("%d%d%d",&c,&a,&b);
			if (c==1)
				mp[a][b]=1;
			if (c==0)
				mp[a][b]=2;
			memset(vis,0,sizeof(vis));
			int ans=0;
			for (j=1;j<=n;j++)
				for (k=1;k<=n;k++)
				if (vis[j][k]==0 && mp[j][k]!=0)
				{
					ans++;
					vis[j][k]=1;
					DFS(j,k,mp[j][k]);
				}
			cout<<ans<<endl;
		}
	}
	return 0;
}


终于知道为什么TLE了。因为不是用的printf而是cout.所以超时了!!!!啊!!!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/modiz/article/details/25658937

智能推荐

AWS 不同区域网络测试方案_Andy____Li的博客-程序员资料

最近被AWS 首尔区域整的焦头烂额,后来发现是北京到东京掉包严重。这里就涉及到新的AWS服务器选型的问题。需要评估一个更稳定的新区域。这里提供部分评估方法和调试经验。https://www.cloudping.info/一个有网站可以辅助测试不同可用区访问情况。当然我们也可以自行测试:http://ec2-reachability.amazonaws.com/首先可以在这个网址内找到相应...

sql_server导出到文本文件_这个呢称没人用的博客-程序员资料

字符编码 ANSI字段间隔 ‘,’行间隔‘|’字段值 enclosed ’”‘MYSQL必须设定字符集为UTF-8find / -iname '*.cnf' -print编辑找到的my.cnfgedit /etc/my.cnf 在[mysqld]下添加default-character-set=utf8在[client]下添加(若无【client】则添加)

关于友元函数_对象为什么不能调用友元函数_无心流泪的博客-程序员资料

1、为什么要引入友元函数:类具有封装性和隐蔽性,只有类的成员函数才能访问类的私有成员,程序中的其他函数式无法访问类的私有成员。但是,有些时候,要求程序设计者必须确保每个类都能够提供足够的成员函数对所有可能遇到的访问请求进行处理(即有可能去访问其他类的私有成员)。并且,由于某些成员函数的频繁调用,由于函数参数的传递、C++严格的类型检查和安全性检查都将带来时间上的开销,从而影响程序的运行效率。

pll锁相环(可以根据系统时钟进行倍频、分频、相位偏移等等,而普通的计数器只能分频)_pll分频_坚持每天写程序的博客-程序员资料

1.PLL是一种反馈控制电路,其特点是利用外部输入的参考信号控制环路内部震荡信号的频率和相位。2.Quartus II软件提供了锁相环PLL的IP核,对时钟网络进行系统级的时钟管理和偏移控制,具有时钟倍频、分频、相位偏移(就相当于时钟的上升沿和下降沿可以移动,换位置等)和可编程占空比(一般是50%)的功能。3. PLL IP核的使用在ip catalog中搜索altpll,然后双击第一个然后点击...在文件夹中新建ipcore文件夹然后命名为pll_clk...

mysql组复制之单主模式部署和实现动态选主的jdbc客户端_单主模式 jdbc配置_碧海潮声吹玉箫的博客-程序员资料

直接进入正题下载mysql5.7+,进入安装目录[[email protected] mysql]# cd /usr/local/mysql[[email protected] mysql]# ll总用量 48drwxr-xr-x. 2 mysql mysql 4096 11月 2 09:59 bin-rw-r--r--. 1 mysql mysql 17987 11月 2 09:59...

php防止SQL注入详解及防范(输入过滤,输出转义)_php clean 防sql注入过滤_fanblog的博客-程序员资料

一个是没有对输入的数据进行过滤(过滤输入),还有一个是没有对发送到数据库的数据进行转义(转义输出)。这两个重要的步骤缺一不可,需要同时加以特别关注以减少程序错误。对于攻击者来说,进行SQL注入攻击需要思考和试验,对数据库方案进行有根有据的推理非常有必要(当然假设攻击者看不到你的源程序和数据库方案),考虑以下简单的登录表单:复制代码 代码如下:Username: Passwo

随便推点

夯实基础之PHP函数---每天熟悉掌握五个函数:字符串函数_weixin_30908707的博客-程序员资料

函数一:chunk_split  将字符串分割成小块函数二:str_split  将一个字符串转换为数组。array str_split ( string $string [, int $split_length = 1 ] )按照每一段的长度来划分,比如一个12个字符的字符串,按照2分,就是6个元素的数组,一个元素两位。返回数组,每个元素2个函数三...

elasticsearch-head 安装教程_bug灾难制造者的博客-程序员资料

ElasticSearch6.2.3+head插件安装的方法步骤前言由于工作原因,需要搭建一台ES服务,因为是研究需要,也出于一个程序员对新技术的尝鲜,所以采用了目前最新6.2.3版本进行实验。本以为按照网上面的相关文章一步一步进行即可快速搭建完成,没想到却遇到很多麻烦,一方面是自己菜鸟一枚,一方面是因为es版本更新效快,网上搜到的很多相关安装方法已经有所变化,正所谓好记心不如烂笔头,所以这里专门针对6.2.3版本的安装方法记录下来,各位如果参考此版本进行安装,请务必留意准备安装的ES版本,尽量不要出

第六篇 nstimer 的使用 !!!_GuoYuXun的博客-程序员资料

第六篇 nstimer 的使用 !!!上一篇说了些废话,这次回到主题,我已经很久没有更新博客了, 刚开始是为了写博客而去写博客, 现在写博客是想记录一下自己的成长,也帮助一下同样遇到困难的程序猿们, 开始我以为有些问题很简单不需要写出来,但是从一些交流群等得取到发现还是有必要的,毕竟有好多初学者会遇到,之后 我会把自己遇到的问题都写出来,希望能够帮助 到有需要的人们. 好了 回到正题nstimer

css:calc可以利用百分比计算长度函数_calc计算百分比_banboo998的博客-程序员资料

#div1 { position: absolute; left: 50px; width: calc(100% - 100px); //这里,只能左边为百分数,右边不能是百分数,这个百分数相对于父容器的宽度来算的 border: 1px solid black; background-color: yellow; padding: 5px; text-align: center;}...

目标检测-VOC数据集txt文件制作方法_voc数据集的txt_AI研习图书馆的博客-程序员资料

本文介绍两种VOC数据集txt文件生成方法,一种是Python实现,一种是MATLAB实现,大家根据自身硬件和需要选择实现方式,免费分享代码。VOC数据集中,在ImageSet目录下包含Main文件,在ImageSets\Main里需要生成四个txt文件,分别是:test.txt train.txt trainval.txt val.txt。

构造函数&析构函数&拷贝构造函数&_post_joke的博客-程序员资料

构造函数:初始化对象的内存空间析构函数:释放对象所占资源1、this指针:指向的是对象的空间地址2、构造函数、析构函数的顺序 先构造的后析构,后构造的先析构3、构造函数、析构函数能不能重载 构造函数可以重载 析构函数不可以重载4、构造函数与析构函数能否自己调用 构造函数不可以自己调用 析构函数可以自己调用,但...

推荐文章

热门文章

相关标签