打败100%
2026-03-17 22:22:34
发布于:江苏
0阅读
0回复
0点赞
加我团队了吗???
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#define ll long long
#define MN 100000
#define mod 2333333
using namespace std;
inline int read()
{
int x = 0; char ch = getchar();
while(ch < '0' || ch > '9') ch = getchar();
while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0';ch = getchar();}
return x;
}
int n,m,c,top,dn,ans,bel[MN*25+5],Cnt=0,Col=0,head[MN*25+5],en,tot,dfn[MN*25+5],low[MN*25+5],col[MN*2+5];
vector<int> v[MN+5],V[MN+5];
bool Cut[MN*25+5],b[MN+5];
struct P
{
int x,y;
P(int x=0,int y=0):x(x),y(y){}
P operator+(P b){return P(x+b.x,y+b.y);}
}p[MN+5],Q[5],q[MN*25+5];
struct edge{int to,next;}e[MN*100+5];
struct My_Map
{
int Head[mod+5],cnt;
struct Hash{ll ha;int x,next;}s[25*MN+5];
void clear()
{
cnt=0;
memset(Head,0,sizeof(Head));
}
void ins(int X,int Y)
{
ll Ha=1LL*X*m+Y;int j=Ha%mod;
s[++cnt]=(Hash){Ha,++Cnt,Head[j]};
Head[j]=cnt;
}
int Check(int X,int Y)
{
ll Ha=1LL*X*m+Y;int j=Ha%mod;
for(int i=Head[j];i;i=s[i].next)
if(s[i].ha==Ha) return s[i].x;
return 0;
}
}mp;
inline void ins(int f,int t){e[++en]=(edge){t,head[f]};head[f]=en;}
inline int abs(int x){return x<0?-x:x;}
bool Check()
{
if(1LL*n*m-c>2) return false;
if(1LL*n*m-c<=1) return true;
top=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=m&&top<2;++j)
if(!mp.Check(i,j)) Q[++top]=P(i,j);
if(Q[1].x==Q[2].x&&abs(Q[1].y-Q[2].y)==1) return true;
if(Q[1].y==Q[2].y&&abs(Q[1].x-Q[2].x)==1) return true;
return false;
}
const int dis[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void build()
{
for(int i=1;i<=c;++i)
for(int j=-2;j<=2;++j)
for(int k=-2;k<=2;++k)
if(j||k)
{
int x=p[i].x+j,y=p[i].y+k;
if(x<=0||y<=0||x>n||y>m||mp.Check(x,y)) continue;
mp.ins(x,y);q[Cnt]=P(x,y);
}
for(int i=1,k;i<=Cnt;++i)
for(int j=0;j<4;++j)
{
int x=q[i].x+dis[j][0],y=q[i].y+dis[j][1];
if(x<=0||y<=0||x>n||y>m||(k=mp.Check(x,y))<=0) continue;
ins(i,k);
}
}
void tj(int x,int fa)
{
dfn[x]=low[x]=++dn;bel[x]=tot;Cut[x]=0;int son=0;
for(int i=head[x];i;i=e[i].next)if(e[i].to!=fa)
{
if(!dfn[e[i].to])
{
++son,tj(e[i].to,x),low[x]=min(low[x],low[e[i].to]);
if(low[e[i].to]>=dfn[x]) Cut[x]=1;
}
else low[x]=min(low[x],dfn[e[i].to]);
}
if(son==1&&!fa) Cut[x]=0;
}
bool Round(int id)
{
for(int i=-1;i<=1;++i)
for(int j=-1;j<=1;++j)
if(i||j)
{
int x=q[id].x+i,y=q[id].y+j;
if(x&&y&&mp.Check(x,y)<0)return 1;
}
return 0;
}
bool check(int t)
{
int col=-1;
for(int l=0;l<V[t].size();++l)
{
int X=p[V[t][l]].x,Y=p[V[t][l]].y;
for(int i=-2;i<=2;++i)
for(int j=-2,k;j<=2;++j)
if(i||j)
{
int x=X+i,y=Y+j;
if(x<1||y<1||x>n||y>m||(k=mp.Check(x,y))<0) continue;
if(col==-1) col=bel[k];
else if(col!=bel[k]) return true;
}
}
return false;
}
void Dfs(int x)
{
col[x]=Col;V[Col].push_back(x);
for(int j=0;j<v[x].size();++j)
if(!col[v[x][j]]) Dfs(v[x][j]);
}
int main()
{
for(int T=read();T;--T)
{
n=read();m=read();c=read();ans=2;mp.clear();
if(m==1||n==1) ans=1;Cnt=-c-1;
for(int i=1;i<=c;++i)
p[i].x=read(),p[i].y=read(),mp.ins(p[i].x,p[i].y);
if(Check()) puts("-1");
else
{
Cnt=0;en=0;tot=0;dn=0;Col=0;build();
for(int i=1,k;i<=c;++i)
for(int j=0;j<4;++j)
{
int x=p[i].x+dis[j][0],y=p[i].y+dis[j][1];
if(x<1||y<1||x>n||y>m) continue;
if((k=mp.Check(x,y))<0) v[i].push_back(k+c+1);
}
for(int i=1;i<=c;++i)
if(!col[i]) ++Col,Dfs(i);
for(int i=1;i<=Cnt;++i)
if(!dfn[i]) ++tot,tj(i,0);
for(int i=1;i<=Cnt&&ans>1;++i) if(Cut[i]&&Round(i)) ans=1;
for(int i=1;i<=Col&&ans;++i)
if(check(i)) ans=0;
printf("%d\n",ans);
memset(head,0,sizeof(int)*(Cnt+5));
for(int i=1;i<=c;++i) v[i].clear(),V[i].clear();
memset(dfn,0,sizeof(int)*(Cnt+5));
memset(low,0,sizeof(int)*(Cnt+5));
memset(col,0,sizeof(int)*(c+5));
}
}
return 0;
}
这里空空如也




有帮助,赞一个