题目链接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; }