题目链接:

D - Coconuts

 HDU - 5925 

题目大意:首先是T组测试样例,然后给你n*m的矩阵,原先矩阵里面都是白色的点,然后再输入k个黑色的点。这k个黑色的点可能会使得原先白色的点分成多个联通块,然后问你白色联通块的个数和每一个连通块里面白色的点的个数。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

具体思路:输入的点坐标比较大,但是个数比较小,所以离散化坐标就可以了。标记每一个整块里面的白色的点的个数就可以了。

AC代码:

 1 #include<bits/stdc++.h>  2 using namespace std;  3 # define ll long long  4 # define inf 0x3f3f3f3f  5 const int maxn = 2e5+100;  6 const int maxm =400+100;  7 vector<ll>contx;  8 vector<ll>conty;// 注意开long long  9 int vis[maxm<<2][maxm<<2];  10 ll a[maxm<<2],cnt;  11 ll Map[maxm<<2][maxm<<2];  12 int f[2][4]= {{1,-1,0,0},{0,0,1,-1}};  13 struct node  14 {  15 int x,y;  16  node() {}  17 node(int xx,int yy)  18  {  19 x=xx;  20 y=yy;  21  }  22 } q[maxn];  23 bool judge(int x,int y)  24 {  25 if(x>=1&&y>=1&&x<=contx.size()&&y<=conty.size())  26 return true;  27 return false;  28 }  29 void dfs(int x,int y)  30 {  31 cnt+=Map[x][y];  32 vis[x][y]=1;  33 for(int i=0; i<4; i++)  34  {  35 int tx=x+f[0][i];  36 int ty=y+f[1][i];  37 if(judge(tx,ty)&&vis[tx][ty]==0)  38  dfs(tx,ty);  39  }  40 }  41 int main()  42 {  43 int T,Case=0;  44 scanf("%d",&T);  45 while(T--)  46  {  47 int n,m,tot;  48 scanf("%d %d",&n,&m);  49 memset(vis,0,sizeof(vis));  50 memset(Map,0,sizeof(Map));  51  contx.clear();  52  conty.clear();  53 scanf("%d",&tot);  54 contx.push_back(1);  55 conty.push_back(1);  56  contx.push_back(n);  57  conty.push_back(m); /// 先把四个角输进去  58 for(int i=1; i<=tot; i++)  59  {  60 scanf("%d %d",&q[i].x,&q[i].y);  61  contx.push_back(q[i].x);  62  conty.push_back(q[i].y);  63 if(q[i].x-1>=1)  64 contx.push_back(q[i].x-1);  65 if(q[i].x+1<=n)  66 contx.push_back(q[i].x+1);  67 if(q[i].y-1>=1)  68 conty.push_back(q[i].y-1);  69 if(q[i].y+1<=m)  70 conty.push_back(q[i].y+1);  71  }  72  sort(contx.begin(),contx.end());  73  sort(conty.begin(),conty.end());  74  contx.erase(unique(contx.begin(),contx.end()),contx.end());  75  conty.erase(unique(conty.begin(),conty.end()),conty.end());  76 for(int i=1; i<=tot; i++)  77  {  78 int t1=lower_bound(contx.begin(),contx.end(),q[i].x)-contx.begin()+1;  79 int t2=lower_bound(conty.begin(),conty.end(),q[i].y)-conty.begin()+1;  80 vis[t1][t2]=1;  81  }  82 for(int i=0; i<contx.size(); i++)  83  {  84 for(int j=0; j<conty.size(); j++)  85  {  86 if(i>0&&j>0)  87 Map[i+1][j+1]=(contx[i]-contx[i-1])*(conty[j]-conty[j-1]);  88 else if(i>0)  89 Map[i+1][j+1]=(contx[i]-contx[i-1])*conty[j];  90 else if(j>0)  91 Map[i+1][j+1]=contx[i]*(conty[j]-conty[j-1]);  92 else  93 Map[i+1][j+1]=contx[i]*conty[j];  94  }  95  }  96 int num=0;  97 for(int i=1; i<=contx.size(); i++)  98  {  99 for(int j=1; j<=conty.size(); j++) 100  { 101 if(vis[i][j])continue; 102 cnt=0; 103  dfs(i,j); 104 a[++num]=cnt; 105  } 106  } 107 sort(a+1,a+num+1); 108 printf("Case #%d:\n",++Case); 109 printf("%d\n",num); 110 for(int i=1; i<=num; i++) 111  { 112 if(i==1) 113 printf("%lld",a[i]); 114 else 115 printf(" %lld",a[i]); 116  } 117 printf("\n"); 118  } 119 return 0; 120 }

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄