wahe @ 2024-07-15 16:46:45
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
int n, m;
int ma[1005][1005], vis[1005][1005], bm[1005][1005];
int xx[4]={1, -1, 0, 0};
int yy[4]={0, 0, 1, -1};
int ans=0;
bool check(int x, int y){
return x >= 1 && x <= n && y >= 1 && y <= n && !vis[x][y];
}
typedef pair <int, int> p;
queue <p> xy;
queue <p> biao;
void bfs(int x, int y){
vis[x][y] = 1;
xy.push({x, y});
while(!xy.empty()){
ans += 1;
int ux = xy.front().fi;
int uy = xy.front().se;
xy.pop();
for(int i=0; i<4; i++){
int tx = ux+xx[i];
int ty = uy+yy[i];
if(check(tx, ty) && (ma[tx][ty] != ma[ux][uy])){
vis[tx][ty] = 1;
xy.push({tx, ty});
biao.push({tx, ty});
}
}
}
}
int main(){
cin >> n >> m;
for(int i=1; i<=n; i++){
for(int j=1; j<=n; j++){
char c;
cin >> c;
ma[i][j] = c-'0';
}
}
for(int i=1; i<=m; i++){
int a, b;
cin >> a >> b;
if(!bm[a][b]){
bfs(a, b);
cout << ans << endl;
while(!biao.empty()){
int x = biao.front().fi;
int y = biao.front().se;
bm[x][y] = ans;
biao.pop();
}
ans = 0;
memset(vis, 0, sizeof vis);
} else{
cout << bm[a][b] << endl;
}
}
return 0;
}
by csyc5586 @ 2024-07-15 16:52:27
@LiShouyi 看得出来是复杂度太高了,得调整代码。其实可以不用那么复杂,可惜我不是大佬改不来代码所以我可以帮你点下错误但是改不来。你就耐心等等大佬来帮你改一改
by wahe @ 2024-07-15 19:17:29
@csyc5586 谢谢
by MY_csp_s @ 2024-07-17 20:26:34
@LiShouyi 有几个可以优化的点 1.你可以尝试用数组模拟一下queue,stl的queue很慢 2.你可以离线处理,把所有可能结果存进一个数组里,最后在读入询问、输出,不用memset那么多次了(你把memset注释掉就会发现第三个点接近0.8s都花在了memset上,其他步骤只花了195ms)
by MY_csp_s @ 2024-07-17 20:47:50
@LiShouyi 我改的代码
by MY_csp_s @ 2024-07-17 21:00:34
@LiShouyi 希望我的代码能对您有用
by wahe @ 2024-07-18 08:30:22
@MY_csp_s 谢谢,已经解决了
by _Kimi_ @ 2024-07-20 13:47:52
@LiShouyi 捉
by wahe @ 2024-07-20 16:47:55
@Kimi 。。。