1 条题解

  • 6
    @ 2024-5-19 13:44:50

    本题首先要推导一下满足条件的数对的性质,由题意可以得知,满足条件的数对,一定在矩阵的同一条对角线上,那就好办了,枚举每一条对角线,对于每条对角线,都计算一次满足条件的数对个数,完美AC!

    #include<bits/stdc++.h>
    using namespace std;
    int a[1001][1001],tong[1001]; 
    int main(){
    	int n,m,ans=0,maxx=-1;
    	cin>>n>>m;
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    			cin>>a[i][j];
    	for(int i=1;i<=m;i++){
    		memset(tong,0,sizeof(tong)); //每次清空一下上次的桶
    		maxx=-1;
    		int x=1,y=i;
    		while(x<=n&&y>=1){
    			tong[a[x][y]]++;
    			maxx=max(maxx,a[x][y]);
    			x++,y--;
    		}
    		for(int j=1;j<=maxx;j++) ans+=tong[j]*(tong[j]-1); //排列组合求数
    	}
    	for(int i=2;i<=n;i++){
    		memset(tong,0,sizeof(tong));
    	    maxx=-1;
    		int x=i,y=m;
    		while(x<=n&&y>=1){
    			tong[a[x][y]]++;
    			maxx=max(maxx,a[x][y]);
    			x++,y--;
    		}
    		for(int j=1;j<=maxx;j++) ans+=tong[j]*(tong[j]-1);
    	}
    	for(int i=1;i<=m;i++){
    		memset(tong,0,sizeof(tong));
    	    maxx=-1;
    		int x=1,y=i;
    		while(x<=n&&y<=m){
    			tong[a[x][y]]++;
    			maxx=max(maxx,a[x][y]);
    			x++,y++;
    		}
    		for(int j=1;j<=maxx;j++) ans+=tong[j]*(tong[j]-1);
        }
    	for(int i=2;i<=n;i++){
    		memset(tong,0,sizeof(tong));
    	    maxx=-1;
    		int x=i,y=1;
    		while(x<=n&&y<=m){
    			tong[a[x][y]]++;
    			maxx=max(maxx,a[x][y]);
    			x++,y++;
    		}
    		for(int j=1;j<=maxx;j++) ans+=tong[j]*(tong[j]-1);
    	}
    	cout<<ans;
    }
    

    写题解不易,请点赞,谢谢!

    • 1

    信息

    ID
    730
    时间
    1000ms
    内存
    256MiB
    难度
    3
    标签
    (无)
    递交数
    40
    已通过
    10
    上传者