TLE了两个点
思路是并查集,但是不知道为什么时间复杂度不对
求调QwQ
#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;
}