RT,lz认为此代码的时间复杂度为 O(n2+m) , 但是7TLE,时间复杂度貌似假了
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;
const int MAXN = 100010 ;
inline int read(){
int x=0,w=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*w;
}
const int posx[10]={0,1,0,-1,0};
const int posy[10]={0,0,1,0,-1};
int n,m,cnt[1010][1010],ans[1000010];
char mapp[1010][1010];
bool vis[1010][1010];
inline bool check(int x,int y){
return (x>=1&&x<=n&&y>=1&&y<=n);
}
inline void bfs(int sx,int sy,int step){
queue<pair<int,int>> q;
q.push(make_pair(sx,sy));
while(!q.empty()){
int nowx=q.front().fi,nowy=q.front().se;
q.pop();
vis[nowx][nowy]=true;
cnt[nowx][nowy]=step;
for(int i=1;i<=4;++i){
int tox=nowx+posx[i],toy=nowy+posy[i];
if(!vis[tox][toy]&&mapp[tox][toy]!=mapp[nowx][nowy]&&check(tox,toy))
q.push(make_pair(tox,toy));
}
}
}
int main ( ) {
n=read();m=read();
for(int i=1;i<=n;++i)
scanf("%s",mapp[i]+1);
int rep=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
if(!vis[i][j])
bfs(i,j,++rep);
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
++ans[cnt[i][j]];
// for(int i=1;i<=n;++i,putchar('\n'))
// for(int j=1;j<=n;++j)
// printf("%d ",cnt[i][j]);
while(m--){
int aa=read(),bb=read();
printf("%d\n",ans[cnt[aa][bb]]);
}
return 0 ;
}