http://acm.zzuli.edu.cn/zzuliacm/problem.php?id=1816
一开始执着于固定左边的矩形,枚举右边的位置,不知道哪里错了,至今还是没找到bug,后面直接考虑坐标
1816: 矩形
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 150 Solved: 46
Submit Status Web Board
Description
小S和小D两个小雪参,在玩一个关于矩形的游戏以帮助他们学会怎么计算矩形的面积然后完成作业去打游戏(两个小雪参一起打游戏你怕不怕!)。他们约定每个人给出两个坐标,分别是两个矩形的左下角和右上角的坐标,他们的游戏规则很简单,就是看谁先找出来这两个矩形的覆盖的总面积大小。你的问题就是帮助他们给出正确答案。
Input
输入的第一行为一个整数T,代表样例的组数。
每组样例包含4个坐标(x,y),( -100000000<= x,y <= 100000000 )前两个是小S给出的矩形左下角和右上角的坐标,后面两个是小D给出来的坐标。
Output
输出两个矩形覆盖的总面积大小。
Sample Input
3-2 -2 2 2 -2 -2 2 20 0 1 1 0 0 2 2-2 -2 2 2 1 -3 3 -1
Sample Output
16419
HINT
Source
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
#include <vector>
#include <set>
#define LL long long
using namespace std;
const int SIZE=1e0+50;
const int maxn=1<<30;
int main(){
int T;
LL x[5],y[5];
scanf("%d",&T);
for(int cas=1;cas<=T;cas++){
for(int i=1;i<=4;i++){
scanf("%lld%lld",&x[i],&y[i]);
}
LL s=(x[2]-x[1])*(y[2]-y[1])+(x[4]-x[3])*(y[4]-y[3]);
LL w=(x[2]-x[1])+(x[4]-x[3])-max(max(x[1],x[2]),max(x[3],x[4]))+min(min(x[1],x[2]),min(x[3],x[4]));
LL h=(y[2]-y[1])+(y[4]-y[3])-max(max(y[1],y[2]),max(y[3],y[4]))+min(min(y[1],y[2]),min(y[3],y[4]));
if(w<=0||h<=0)printf("%lld\n",s);
else printf("%lld\n",s-w*h);
}
return 0;
}