标签:
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=5925
#include <algorithm> #include <iostream> #include <cstring> #include <vector> #include <cstdio> #include <cmath> using namespace std; typedef long long LL; const int N=405; LL dx[N],dy[N];///表示每一格压缩的长度; bool v[N][N]; int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}}; LL r,c; int n; struct Node{ long long v,p; int id; }x[N],y[N]; bool cmp1(const Node s1,const Node s2){ return s1.v<s2.v; } bool cmp2(const Node s1,const Node s2){ return s1.id<s2.id; } LL dfs(int sx,int sy) { LL sum=dx[sx]*dy[sy]; v[sx][sy]=true; for(int i=0;i<4;i++){ int nx=sx+dir[i][0]; int ny=sy+dir[i][1]; if(nx>0&&ny>0&&nx<=r&&ny<=c) if(!v[nx][ny]){ sum+=dfs(nx,ny); } } return sum; } int main() { int T,Case=1; cin>>T; while(T--) { printf("Case #%d:\n",Case++); scanf("%lld%lld%d",&r,&c,&n); for(int i=1;i<=n;i++) { scanf("%lld%lld",&x[i].v,&y[i].v); x[i].id=i; y[i].id=i; } sort(x+1,x+n+1,cmp1); sort(y+1,y+n+1,cmp1); x[n+1].v=r; y[n+1].v=c; x[n+1].id=y[n+1].id=n+1; x[0].v=y[0].v=1; x[0].id=y[0].id=0; int tot=1; dx[1]=1; for(int i=1;i<=n+1;i++) { if(x[i].v==x[i-1].v){ x[i].p=tot; } else if(x[i].v==x[i-1].v+1){ x[i].p=++tot; dx[tot]=1; } else { x[i].p=tot+2; dx[tot+2]=1; dx[tot+1]=x[i].v-x[i-1].v-1; tot+=2; } } r=tot; tot=1; dy[1]=1; for(int i=1;i<=n+1;i++) { if(y[i].v==y[i-1].v){ y[i].p=tot; } else if(y[i].v==y[i-1].v+1){ y[i].p=++tot; dy[tot]=1; } else { y[i].p=tot+2; dy[tot+2]=1; dy[tot+1]=y[i].v-y[i-1].v-1; tot+=2; } } c=tot; memset(v,0,sizeof(v)); sort(x+1,x+n+1,cmp2); sort(y+1,y+n+1,cmp2); for(int i=1;i<=n;i++) v[x[i].p][y[i].p]=true; long long ans[N]; tot=0; for(LL i=1;i<=r;i++) for(LL j=1;j<=c;j++) if(!v[i][j]) ans[tot]=dfs(i,j),tot++; sort(ans,ans+tot); printf("%d\n",tot); for(int i=0;i<tot;i++) printf("%lld%c",ans[i],(i+1==tot)?‘\n‘:‘ ‘); } return 0; }
2016 长春东北赛---Coconuts(离散化+DFS)
标签:
原文地址:http://www.cnblogs.com/chen9510/p/5936513.html