QDU71 矩形
题意很简单:
给你两个平行于x轴的矩形的左下角和右上角的顶点坐标(全都是整数坐标),让你求这两个矩形所能覆盖的总面积大小(也就是两个矩形面积的并集)。
输入的第一行为一个整数T,代表样例的组数。(T<=1000) 每组样例包含4个坐标(x,y),( -100000000<= x,y <= 100000000 )前两个是第一个矩形左下角和右上角的坐标,后面两个是第二个矩形的坐标。所有输入数据都是整数。
每组样例对应一个数,表示两个矩形覆盖的总面积大小。
复制
3 -2 -2 2 2 -2 -2 2 2 0 0 1 1 0 0 2 2 -2 -2 2 2 1 -3 3 -1
16 4 19
这题是求两个矩形的面积并,因为只有两个矩形可以暴力乱搞,或者套一些成熟的算法比如考虑矩形切割思想或者比较麻烦的扫描线求矩形面积并。
#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> using namespace std; long long x[5],y[5]; int main() { int t; long long x1,y1,x2,y2,x3,y3,x4,y4; scanf("%d",&t); while(t--) { scanf("%lld%lld%lld%lld%lld%lld%lld%lld",&x1,&y1,&x2,&y2,&x3,&y3,&x4,&y4); x[0]=x1; x[1]=x2; x[2]=x3; x[3]=x4; y[0]=y1; y[1]=y2; y[2]=y3; y[3]=y4; sort(x,x+4); sort(y,y+4); long long s=(x2-x1)*(y2-y1)+(x4-x3)*(y4-y3); long long w=(x2-x1)+(x4-x3)-(x[3]-x[0]); long long h=(y2-y1)+(y4-y3)-(y[3]-y[0]); if(w<=0||h<=0) { printf("%lld\n",s); } else { printf("%lld\n",s-w*h); } } return 0; }