题目链接http://codeforces.com/problemset/problem/15/B
坐标中的各种求面积
o(︶︿︶)o 唉 , 啥也别说了 发现我每次碰到这种题就要跪。
将题目中给你的两个点构成一个小矩形
然后算出大矩形之中小矩形的个数,每个小矩形都有两个顶点是要排除的,排除的过程中可能会重复,然后把重复去掉的部分再加一次(容斥)
例如:在4X4矩形中两个点(1,1)(1,2)
1332
1332
1332
1332 (其中1表示第一个点能到达第二个点不能到达的地方,2表示第二个点能到达的地方第一个点不能到达的地方,3表示他们重复的部分,即运动过程中,两个点都到达过的地方)
该测试数据算得: 小矩形的竖边x= 1;横边y= 2;
小矩形的个数=(n-x+1)*(m-y+1)=(4-1+1)*(4-2+1)= 12
重复的区域=((n-x)+1-x+1) * ((m-y)+1-y+1)= 4*2=8
所以最后结果ans= 4*4-2*12+8=0
#include
#include
#include
#include
#include
using namespace std;
__int64 f(__int64 x)
{
return x> 0? x: -x;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
__int64 n,m,a1,b1,a2,b2,a3,b3,a4,b4,a5,b5,a6,b6;
scanf("%I64d %I64d %I64d %I64d %I64d %I64d",&n,&m,&a1,&b1,&a2,&b2);
__int64 s,red,cov=0;
__int64 x,y;
x=f(a1-a2)+1;
y=f(b1-b2)+1;
s= n*m;
red= (n-x+1)*(m-y+1)*2;//需排除的点个数(包括重复的)= 小矩形的个数*2
if((n-x+1)>=x&&(m-y)+1>=y)
cov= ((n-x)+1-x+1) * ((m-y)+1-y+1);//通过两个顶点的运动面积的重复计算重复排除的点
printf("%I64d\n",s-red+cov);
}
return 0;
}