1 条题解
-
0
C++ :
#include<cstdio> using namespace std; int fa[1100000]; int a[1100][1100],tot[11000000],ans1,ans2,cnt,n; bool bk[1100000][2];//0是山峰,1是山谷 int dx[]={-1,-1,-1,0,1,1,1,0}; int dy[]={-1,0,1,1,1,0,-1,-1}; inline int zh(int x,int y){return (x-1)*n+y;} inline bool check(int x,int y){return (1<=x && 1<=y && x<=n && y<=n);} int findfa(int x) { if(fa[x]==x)return x; return fa[x]=findfa(fa[x]); } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { scanf("%d",&a[i][j]); fa[zh(i,j)]=zh(i,j); if(check(i-1,j) && a[i-1][j]==a[i][j]) { int ty=findfa(zh(i-1,j)); fa[ty]=zh(i,j); } if(check(i,j-1) && a[i][j-1]==a[i][j]) { int ty=findfa(zh(i,j-1)); fa[ty]=zh(i,j); } if(check(i-1,j-1) && a[i-1][j-1]==a[i][j]) { int ty=findfa(zh(i-1,j-1)); fa[ty]=zh(i,j); } if(check(i-1,j+1) && a[i-1][j+1]==a[i][j]) { int ty=findfa(zh(i-1,j+1)); fa[ty]=zh(i,j); } } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(fa[zh(i,j)]==zh(i,j))tot[zh(i,j)]=++cnt,bk[cnt][0]=bk[cnt][1]=true; } } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { for(int t=0;t<=7;t++) { int tx=i+dx[t],ty=j+dy[t]; if(check(tx,ty) && a[tx][ty]<a[i][j])bk[tot[findfa(fa[zh(i,j)])]][1]=false; else if(check(tx,ty) && a[tx][ty]>a[i][j])bk[tot[findfa(fa[zh(i,j)])]][0]=false; } } } for(int i=1;i<=cnt;i++)ans1+=bk[i][0],ans2+=bk[i][1]; printf("%d %d\n",ans1,ans2); return 0; }
- 1
信息
- ID
- 1060
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 2
- 上传者