1 条题解

  • 0
    @ 2025-9-10 9:06:30

    C++ :

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define N 2010
    #define k1 1000003
    #define k2 101
    using namespace std;
     
    int n, m, map[N][N], now, ans, L, R, mid;
    unsigned int s[3][N][N], b1[N*N], b2[N*N];
    //s[0]-->上->下,左->右
    //s[1]-->上->下,右->左
    //s[2]-->下->上,左->右
     
    inline int read(){
        int x=0, f=1; char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
        return x*f;
    }
     
    int check(int l1, int r1, int l2, int r2){
        int x0, x1, x2;
        x0=s[0][r1][r2]-s[0][r1][l2-1]*b2[r2-l2+1]-s[0][l1-1][r2]*b1[r1-l1+1]+s[0][l1-1][l2-1]*b1[r1-l1+1]*b2[r2-l2+1];
        x1=s[1][r1][l2]-s[1][r1][r2+1]*b2[r2-l2+1]-s[1][l1-1][l2]*b1[r1-l1+1]+s[1][l1-1][r2+1]*b1[r1-l1+1]*b2[r2-l2+1];
        if(x0!=x1)return 0;
        x2=s[2][l1][r2]-s[2][l1][l2-1]*b2[r2-l2+1]-s[2][r1+1][r2]*b1[r1-l1+1]+s[2][r1+1][l2-1]*b1[r1-l1+1]*b2[r2-l2+1];
        if(x0!=x2)return 0;
        return 1;
    }
     
    int main(){
        n=read(); m=read();
        memset(map, 0, sizeof(map));
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)map[i*2-1][j*2-1]=read();
        n=n*2-1; m=m*2-1;
        b1[0]=1; for(int i=1; i<=n*m; i++)b1[i]=b1[i-1]*k1;
        b2[0]=1; for(int i=1; i<=n*m; i++)b2[i]=b2[i-1]*k2;
        memset(s, 0, sizeof(s));
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)s[0][i][j]=s[0][i][j-1]*k2+map[i][j];
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)s[0][i][j]+=s[0][i-1][j]*k1;
        for(int i=1; i<=n; i++)
            for(int j=m; j; j--)s[1][i][j]=s[1][i][j+1]*k2+map[i][j];
        for(int i=1; i<=n; i++)
            for(int j=m; j; j--)s[1][i][j]+=s[1][i-1][j]*k1;
        for(int i=n; i; i--)
            for(int j=1; j<=m; j++)s[2][i][j]=s[2][i][j-1]*k2+map[i][j];
        for(int i=n; i; i--)
            for(int j=1; j<=m; j++)s[2][i][j]+=s[2][i+1][j]*k1;
        ans=0;
        for(int i=1; i<=n; i++)
            for(int j=1; j<=m; j++)if((i+j)%2==0){
                L=1; R=min(min(i, n-i+1), min(j, m-j+1));
                while(L<R){
                    mid=(L+R)>>1; if(L==R-1)mid++;
                    if(check(i-mid+1, i+mid-1, j-mid+1, j+mid-1))L=mid; else R=mid-1;
                }
                if(i&1)ans+=(L+1)/2; else ans+=L/2;
            }
        printf("%d", ans);
        return 0;
    }
    
    • 1

    信息

    ID
    3758
    时间
    2000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者