• hdu_5925_Coconuts(离散化+dfs)


    题目链接:hdu_5925_Coconuts

    题意:

    给你一张很大的图,和小于200个的障碍点,问这张图中的联通块有多少个

    题解:

    由于障碍点只有200个,所以肯定有很多的空白部分,我们将这些空白部分 分成k个矩形来压缩,最终形成的压缩图就最大为400*400,然后dfs一下联通块就行了

     1 #include<bits/stdc++.h>
     2 #define F(i,a,b) for(int i=a;i<=b;i++)
     3 using namespace std;
     4 typedef long long ll;
     5 
     6 const int N=407;
     7 int t,ic=1,NN,C,n,edans,mp[N][N],x[N],y[N],X[N],Y[N],hs_x[N],hs_y[N],edx,edy,XX,YY,h[N],l[N];
     8 ll ans[N];
     9 
    10 void dfs(int i,int j)
    11 {
    12     ans[edans]+=1ll*h[i]*l[j],mp[i][j]=1;
    13     if(i>1&&!mp[i-1][j])dfs(i-1,j);
    14     if(i<XX&&!mp[i+1][j])dfs(i+1,j);
    15     if(j>1&&!mp[i][j-1])dfs(i,j-1);
    16     if(j<YY&&!mp[i][j+1])dfs(i,j+1);
    17 }
    18 
    19 int main()
    20 {
    21     scanf("%d",&t);
    22     while(t--)
    23     {
    24         scanf("%d%d%d",&NN,&C,&n);
    25         F(i,1,n)scanf("%d%d",x+i,y+i),hs_x[i]=x[i],hs_y[i]=y[i];
    26         hs_x[n+1]=0,hs_x[n+2]=NN+1,hs_y[n+1]=0,hs_y[n+2]=C+1;
    27         edx=edy=n+2,XX=YY=0,edans=0;
    28         sort(hs_x+1,hs_x+1+edx),edx=unique(hs_x+1,hs_x+1+edx)-hs_x-1;
    29         sort(hs_y+1,hs_y+1+edy),edy=unique(hs_y+1,hs_y+1+edy)-hs_y-1;
    30         F(i,2,edx)
    31         {
    32             if(hs_x[i]>hs_x[i-1]+1)h[++XX]=hs_x[i]-hs_x[i-1]-1;
    33             if(i!=edx)h[++XX]=1;
    34             F(j,1,n)if(x[j]==hs_x[i])X[j]=XX;
    35         }
    36         F(i,2,edy)
    37         {
    38             if(hs_y[i]>hs_y[i-1]+1)l[++YY]=hs_y[i]-hs_y[i-1]-1;
    39             if(i!=edy)l[++YY]=1;
    40             F(j,1,n)if(y[j]==hs_y[i])Y[j]=YY;
    41         }
    42         F(i,1,XX)F(j,1,YY)mp[i][j]=0;
    43         F(i,1,n)mp[X[i]][Y[i]]=1;
    44         F(i,1,XX)F(j,1,YY)if(!mp[i][j])ans[++edans]=0,dfs(i,j);
    45         sort(ans+1,ans+1+edans);
    46         printf("Case #%d:
    %d
    ",ic++,edans);
    47         F(i,1,edans)printf("%lld%c",ans[i]," 
    "[i==edans]);
    48     }
    49     return 0;
    50 }
    View Code
  • 相关阅读:
    windows内核函数1
    驱动程序中获取当前进程的进程名的方法
    vs2008+WDK7600驱动开发环境配置
    P2P之UDP穿透NAT的原理与实现之我见
    设计模式-工厂模式
    C++解析ini文件_转载
    利用sort和lambda表达式对vector中的pair进行排序
    C++ 获取目录下具有指定后缀名的所有文件名_windows
    深度学习提取得到的特征值进行特征值相似度比对
    C/C++从路径字符串中获取文件名
  • 原文地址:https://www.cnblogs.com/bin-gege/p/5943868.html
Copyright © 2020-2023  润新知