1 条题解
-
6
本题首先要推导一下满足条件的数对的性质,由题意可以得知,满足条件的数对,一定在矩阵的同一条对角线上,那就好办了,枚举每一条对角线,对于每条对角线,都计算一次满足条件的数对个数,完美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
- 上传者