不吸氧只有30pts,吸氧也只有60pts,其他的点全部TLE,这题怎么优化啊
查看原帖
不吸氧只有30pts,吸氧也只有60pts,其他的点全部TLE,这题怎么优化啊
461366
封禁用户楼主2021/8/30 07:54

RT

#include <bits/stdc++.h>
using namespace std;

const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};
int n, m, vis[505][505];
char mat[505][505];
pair<int, int> fa[505][505];

pair<int, int> find(int x, int y) {
	if (fa[x][y] == make_pair(x, y)) return make_pair(x, y);
	return fa[x][y] = find(fa[x][y].first, fa[x][y].second);
}

void merge(int x, int y, int X, int Y) {
	pair<int, int> p = find(x, y), p2 = find(X, Y);
	if (p != p2) fa[p.first][p.second] = make_pair(p2.first, p2.second);
}

int main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	memset(mat, -1, sizeof(mat));
	cin >> n >> m;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= n; j++)
			fa[i][j] = make_pair(i, j);
	while (m--) {
		int c, x, y;
		cin >> c >> x >> y;
		mat[x][y] = c;
		for (int i = 0; i < 4; i++) {
			int nx = x + dx[i];
			int ny = y + dy[i];
			if (1 <= nx && nx <= n && 1 <= ny && ny <= n && mat[x][y] == mat[nx][ny]) merge(x, y, nx, ny);
		}
		int ans = 0;
		for (int i = 1; i <= n; i++)
			for (int j = 1; j <= n; j++)
				if (find(i, j) == make_pair(i, j) && mat[i][j] != -1)
					ans++;
		cout << ans << endl;
	}
	return 0;
}
2021/8/30 07:54
加载中...