BZOJ 1142: [POI2009]Tab【并查集/hash

80 篇文章 0 订阅
7 篇文章 0 订阅

有一万种写法2333

可以hash可以并查集,反正xjb写写就好【并查集虚的不行2333竟然没有T

#include<bits/stdc++.h>
#define MAXN 1005
#define base 1000000
#define MAXZ 2000006
using namespace std;	int T,n,m;
inline int read(){
	register char ch = getchar();
	while((ch^'-')&&!isdigit(ch))	ch = getchar();
	register int rtn = 0 , f = 1;
	if(ch=='-')	f = -1 , ch = getchar();
	while(isdigit(ch))	rtn = rtn*10 + ch - '0' , ch = getchar();
	return f*rtn;
}
//====================================================
int a[MAXN][MAXN] , b[MAXN][MAXN];
int fth_col[MAXZ] , fth_lin[MAXZ] , tag[MAXZ];
int find_col(int x){
	return x==fth_col[x]? x: fth_col[x] = find_col(fth_col[x]);
}
inline void merge_col(int x,int y){
	fth_col[find_col(x)] = find_col(y);
}
int find_lin(int x){
	return x==fth_lin[x]? x: fth_lin[x] = find_lin(fth_lin[x]);
}
inline void merge_lin(int x,int y){
	fth_lin[find_lin(x)] = find_lin(y);
}

int main(){
	//freopen("1.in","r",stdin);
	T = read();
	while(T--){
		n = read() , m = read();
		for(register int i=0;i<=MAXZ;++i)	fth_col[i] = fth_lin[i] = i , tag[i] = 0;
		
		a[1][1] = read() + base;
		for(int i=2;i<=m;++i)
			a[1][i] = read() + base , merge_lin(a[1][i] , a[1][1]);
		for(int i=2;i<=n;++i){
			a[i][1] = read() + base;
			merge_col(a[i][1] , a[1][1]);
			for(int j=2;j<=m;++j){
				a[i][j] = read() + base;
				merge_lin(a[i][1] , a[i][j]);
				merge_col(a[i][j] , a[1][j]);
			}
		}

		for(int i=1;i<=n;++i)	for(int j=1;j<=m;++j)	tag[a[i][j]] = 1 , find_col(a[i][j]) , find_lin(a[i][j]);
		
		for(int i=1;i<=n;++i)	for(int j=1;j<=m;++j)	b[i][j] = read() + base;

		int flag = 0;
		for(int i=2;i<=n;++i){
			for(int j=2;j<=m;++j){
				if(!tag[b[i][j]]){
					flag = 1;
					break;
				}
				if((fth_lin[b[i][j]] ^ fth_lin[b[i][1]]) || (fth_col[b[i][j]] ^ fth_col[b[1][j]])){
					flag = 1;
					break;
				}
			}
			if(flag)	break;
		}
		puts(flag?"NIE":"TAK");
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值