USACO Section 3.1 Shaping Regions

来源:互联网 发布:2016外商直接投资数据 编辑:程序博客网 时间:2024/05/21 10:01

题意:

许多不同颜色的矩形放在桌上(可能重叠)  求  能看见的颜色和它的面积


思路:

桌子最大 1W*1W  朴素的做一定会TLE

然后我的直觉告诉我这题是二维线段树  因为要解决区域覆盖问题

可能是由于今年长春站就死在这上对这个很敏感 - -b  不过区域还是太大  空间不够会MLE

因此再想其他方法  发现矩形的数目较少可以从此入手

很容易想到  后加进来的矩形会覆盖前面的矩形  因此我们可以把矩形倒序扫描

然后就剩计算面积这个问题了  借用“切分”等想法可以想到矩形切割

每次将一个新的矩形与之后的矩形比较  切掉相交部分  剩余部分继续递归处理  计算对该颜色的贡献面积

递归的方法很适合“分块”、“切分”等思路的实现  因为递归本来就是“分而治之”的常用手段  以后要注意


代码:

/*ID: housera1PROG: rect1LANG: C++*/#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct rectangle{int l,r,u,d,c;}f[1010];int n;int col[2510];int dfs(int l,int d,int r,int u,int x){int tmp=0;if(x>n) return (u-d+1)*(r-l+1);if( f[x].d>u || f[x].u<d || f[x].l>r || f[x].r<l ) return dfs(l,d,r,u,x+1);if( f[x].u<u ) tmp+=dfs(l,f[x].u+1,r,u,x+1);if( f[x].d>d ) tmp+=dfs(l,d,r,f[x].d-1,x+1);u=min(u,f[x].u); d=max(d,f[x].d);if( f[x].l>l && f[x].l<=r ) tmp+=dfs(l,d,f[x].l-1,u,x+1);if( f[x].r>=l && f[x].r<r ) tmp+=dfs(f[x].r+1,d,r,u,x+1);return tmp;}int main(){int Debug=0;if(!Debug){freopen("rect1.in","r",stdin);freopen("rect1.out","w",stdout);}int i,j;scanf("%d%d%d",&i,&j,&n);f[0].l=0; f[0].d=0; f[0].r=i-1; f[0].u=j-1; f[0].c=1;for(i=1;i<=n;i++){scanf("%d%d%d%d%d",&f[i].l,&f[i].d,&f[i].r,&f[i].u,&f[i].c);f[i].r--;f[i].u--;}for(i=n;i>=0;i--) col[f[i].c]+=dfs(f[i].l,f[i].d,f[i].r,f[i].u,i+1);for(i=1;i<=2500;i++) if(col[i]) printf("%d %d\n",i,col[i]);return 0;}


0 0
原创粉丝点击