Usaco Training Section 6.2Shaping Regions

Shaping Regions 形成的区域
N 个不同的颜色的不透明的长方形(1 <= N <= 1000)被放置在一张宽为A 长为B 的白纸上.这
些长方形被放置时,保证了它们的边于白纸的边缘平行.所有的长方形都放置在白纸内,所以我们会看到不同形状的各种颜色.坐标系统的原点(0,0)设在这张白纸的左下角,而坐标轴则平行于边缘.
PROGRAM NAME: rect1
INPUT FORMAT
每行输入的是放置长方形的方法.
第一行输入的是那个放在底的长方形(即白纸).
第 1 行: A , B 和 N, 由空格分开 (1 <=A, B<=10,000)
第 2 到N+1 行: 为五个整数 llx, lly, urx, ury, color 这是一个长方形的左下角坐标,右上
角坐标和颜色.
颜色 1 和底部白纸的颜色相同.
SAMPLE INPUT (file rect1.in)
20 20 3
2 2 18 18 2
0 8 19 19 3
8 0 10 19 4
OUTPUT FORMAT
输出文件应该包含一个所有能被看到颜色连同该颜色的总面积的清单( 即使颜色的区域不是连续
的),按color 的增序顺序.
不要显示没有区域的颜色.
SAMPLE OUTPUT (file rect1.out)
1 91
2 84
3 187
4 38

分析:我们可以倒着做,每次用当前矩形分割之前矩形。

Usaco Training Section 6.2Shaping Regions_第1张图片

#include
#define ll long long
#define ull unsigned long long
#define inf 2147483647
#define mp make_pair
#define pii pair
#define pb push_back
#define r1 rt<<1
#define r2 rt<<1|1
#define ld long double
using namespace std;

inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^'0'),c=getchar();
	return x*f;
}

const int N=1005;
int n,s[N],x1[N],x2[N],y11[N],y2[N],c[N],maxc;
void cover(int lx,int ly,int rx,int ry,int C,int i){
	if(lx==rx||ly==ry) return;
	if(i>n){s[C]+=(rx-lx)*(ry-ly);return;}
	if(lyx2[i]) cover(max(x2[i],lx),min(y2[i],ly),rx,min(y2[i],ry),C,i+1);
	if(ry>y2[i]) cover(max(lx,x1[i]),max(y2[i],ly),max(rx,x1[i]),ry,C,i+1);
	if(lx=0;--i) cover(x1[i],y11[i],x2[i],y2[i],c[i],i+1);
	for(int i=1;i<=maxc;++i)
		if(s[i]) printf("%d %d\n",i,s[i]);
	return 0;
}

 

你可能感兴趣的:(UsacoTraining)