CF15bLaser

题目链接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<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<limits.h>
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;
}


 

你可能感兴趣的:(CF)