90分TLE求调
  • 板块P1141 01迷宫
  • 楼主yuyang0974
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/9 13:54
  • 上次更新2025/1/9 20:37:25
查看原帖
90分TLE求调
1408977
yuyang0974楼主2025/1/9 13:54

点这里是提交记录

TLE了两个点

思路是并查集,但是不知道为什么时间复杂度不对

求调QwQQwQ

#include <bits/stdc++.h>
using namespace std;
inline int read() {  //快读
	int x = 0;
	char c = getchar();
	while (c < '0' || c > '9') c = getchar();
	while (c >= '0' && c <= '9') {
		x = (x << 1) + (x << 3) + c - '0';
		c = getchar();
	}
	return x;
}
const int maxn = 1e3 + 4;
int n, m;
char s[maxn][maxn];  //存原图
int root[maxn * maxn];
int sum[maxn * maxn];   //每个并查集的方格数
int fid(int x) {return x == root[x] ? x : fid(root[x]);}
void init () {   //初始化root和sum
	int p;
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= n; j ++) {
			p = (i - 1) * n + j;
			root[p] = p;
			sum[p] = 1;
		}
	}
}
inline void Merge (int x, int y) {  //合并区块
	int fx = fid(x), fy = fid(y);
	if (!(fx ^ fy)) return;
	root[fx] = fy;
	sum[fy] += sum[fx];
}
int main () {
	n = read(), m = read();
	for (int i = 1; i <= n; i ++) scanf ("%s", s[i] + 1);   //读入
	init ();   //初始化
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= n; j ++) {
            //这里是合并的操作
			if (j < n && (s[i][j] ^ s[i][j + 1])) Merge((i - 1) * n + j, (i - 1) * n + j + 1);
			if (i < n && (s[i][j] ^ s[i + 1][j])) Merge((i - 1) * n + j, i * n + j); 
		}
	}
	for (int i = 1, x, y; i <= m; i ++) {  //处理输出
		x = read(), y = read();
		printf ("%d\n", sum[fid((x - 1) * n + y)]);
	}
	return 0;
}
2025/1/9 13:54
加载中...