88 TLE+WA 求条,玄3关,码风良好
查看原帖
88 TLE+WA 求条,玄3关,码风良好
1046894
hyxgg楼主2024/12/28 16:40
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
struct dian{
    ll x,y,bh,sy,pp;
}yd[2500105];
struct edge
{
    ll q,z,xg;
}ed[19300005];
ll n,m,t,c,qx[100005],qy[1000005],pdd,ydd,dd[2500005],db,p[2500005],
fa[2500005],dfn[2500005],low[2500005],cnt,pp[2500205];
ll zbb(ll x){
    return fa[x]==x?x:zbb(fa[x]);
}
void fjq(ll q,ll z){
    ed[++db].q=q,ed[db].z=z,ed[db].xg=dd[q],dd[q]=db;
}
bool cmp1(dian a,dian b){
    return a.x==b.x?a.y==b.y?a.bh>b.bh:a.y<b.y:a.x<b.x;
}
bool cmp2(dian a,dian b){
    return a.y==b.y?a.x<b.x:a.y<b.y;
}
ll read(){
    char c=getchar();
    ll s=0;
    while(c<'0'||c>'9'){
        c=getchar();
    }
    while(c>='0'&&c<='9'){
        s=s*10+c-'0';
        c=getchar();
    }
    return s;
}
void dfs(ll root){
    dfn[root]=low[root]=++cnt;
    //cout<<root<<':'<<dfn[root]<<endl;
    ll son=0;
    for(ll i=dd[root];i;i=ed[i].xg){
        // //cout<<
        ll to=ed[i].z;
        //cout<<root<<' '<<to<<endl;
        if(dfn[to]){
            low[root]=min(low[root],dfn[to]);
        }
        else{
            
            dfs(to);
            if(low[to]>=dfn[root]){
                son++;
                // cout<<root<<' '<<to<<endl;
                if(pp[root]){
                    // cout<<root<<' '<<to<<endl;
                    if(dfn[root]==1){
                        if(son>1)pdd=1;
                    }
                    else{
                        pdd=1;
                    }
                }
                //cout<<"pdd"<<root<<' '<<to<<' '<<pdd<<endl;
            }
            low[root]=min(low[root],low[to]);
        }
    }
    //cout<<root<<';'<<low[root]<<endl;
}
int main(){
    // freopen("P1173_7.in","r",stdin);
    // freopen("out.out","w",stdout);
    scanf("%lld",&t);
    while(t--){
        ydd=cnt=db=0,
        n=read(),m=read(),c=read();
        for(ll i=1;i<=c;i++){
            qx[i]=read(),qy[i]=read();
        }
        if(n*m-c<=1){
            printf("-1\n");
            continue;
        }
        qx[++c]=0,qy[c]=0;
        qx[++c]=0,qy[c]=m+1;
        qx[++c]=n+1,qy[c]=0;
        qx[++c]=n+1,qy[c]=m+1;
        for(ll i=1;i<=c;i++){
            fa[i]=i;
            for(ll xx=max(1ll,qx[i]-2);xx<=min(n,qx[i]+2);xx++){
                for(ll yy=max(1ll,qy[i]-2);yy<=min(qy[i]+2,m);yy++){
                    if(xx==qx[i]&&yy==qy[i])yd[++ydd]={xx,yy,114514,i};
                    else yd[++ydd]={xx,yy,0,i};
                    if(abs(xx-qx[i])<=1||abs(yy-qy[i])<=1){
                        yd[ydd].pp=1;
                    }
                }
            }
        }
        
        sort(yd+1,yd+1+ydd,cmp1);
        ll td=0,ks=c;
        // //cout<<ks<<endl;
        for(ll i=1;i<=ydd;i++){
            if(yd[i].bh==114514){
                if(yd[i+1].x==yd[i].x&&yd[i+1].y==yd[i].y)yd[i+1].bh=114514;
                continue;
            }
            if(yd[i].x==yd[td].x&&yd[i].y==yd[td].y){
                pp[td]|=yd[i].pp;
                ll xb=zbb(yd[i].sy),yb=zbb(yd[td].sy);
                // //cout<<yd[i].x<<' '<<yd[i].y<<' '<<xb<<' '<<yb<<endl;
                if(xb!=yb){
                    fa[xb]=yb;
                    ks--;
                }
                // pp[]
                continue;
            }
            yd[++td]=yd[i];
            yd[td].bh=td;
            pp[td]=yd[i].pp;
            // cout<<pp[td]<<' '<<td<<"LLL"<<endl;
            dfn[td]=dd[td]=low[td]=0;
        }ydd=td;
        for(ll i=1;i<=ydd;i++){
            // cout<<yd[i].x<<' '<<yd[i].y<<' '<<yd[i].bh<<' '<<yd[i].sy<<endl;
        }
        for(ll i=2;i<=ydd;i++){
            if(yd[i].x==yd[i-1].x&&yd[i].y==yd[i-1].y+1){
                ll xb=zbb(yd[i].sy),yb=zbb(yd[i-1].sy);
                if(xb!=yb){
                    continue;
                }
                fjq(yd[i].bh,yd[i-1].bh),fjq(yd[i-1].bh,yd[i].bh);
            }
        }
        sort(yd+1,yd+1+ydd,cmp2);
        for(ll i=2;i<=ydd;i++){
            if(yd[i].x==yd[i-1].x+1&&yd[i].y==yd[i-1].y){
                ll xb=zbb(yd[i].sy),yb=zbb(yd[i-1].sy);
                if(xb!=yb){
                    continue;
                }
                fjq(yd[i].bh,yd[i-1].bh),fjq(yd[i-1].bh,yd[i].bh);
            }
        }
        // for(ll i=1;i<=db;i++){
        //     ////cout<<ed[i].q<<' '<<ed[i].z<<endl;
        // }
        ll gs=0;
        pdd=0;
        for(ll i=1;i<=ydd;i++){
            
            if(!dfn[i]){
                cnt=0;
                gs++;
                dfs(i);
                //cout<<i<<endl<<endl;
            }
            // //cout<<yd[i].x<<' '<<yd[i].y<<' '<<yd[i].bh<<' '<<yd[i].sy<<endl;
              
        }
        //cout<<gs<<' '<<ks<<"ppp"<<endl;
        c-=4;
        if(n*m-c==2){
            if(gs>1){
                printf("0\n");
            }
            else printf("-1\n");
            continue;
        }
        if(ks!=gs){
            printf("0\n");
        }
        else if(pdd){
            printf("1\n");
        }
        else if(n==1||m==1){
            printf("1\n");
        }
        else printf("2\n");
    }
    
    return 0;
}
2024/12/28 16:40
加载中...