1 条题解

  • 0
    @ 2023-6-21 20:14:12

    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

    #10032. 「一本通 1.4 练习 4」山峰和山谷「POI2007」

    信息

    ID
    1060
    时间
    1000ms
    内存
    128MiB
    难度
    10
    标签
    递交数
    3
    已通过
    2
    上传者