CodeForces 15B Laser
题目链接:http://codeforces.com/problemset/problem/15/B
题意:给出n*m的一块巧克力,再给出两个点,两点只能同时移动,两点所占位置巧克力会融化,问所有能走位置走遍之后还剩下几块巧克力。
思路:题目就是给两个矩形,然后算两个点所走位置的并集对于全集的补集。点都可以变成左上方一个点和右下方,然后可以分成两种情况。第一种是两个所走矩形不相交,第二种是相交。
题意:给出n*m的一块巧克力,再给出两个点,两点只能同时移动,两点所占位置巧克力会融化,问所有能走位置走遍之后还剩下几块巧克力。
思路:题目就是给两个矩形,然后算两个点所走位置的并集对于全集的补集。点都可以变成左上方一个点和右下方,然后可以分成两种情况。第一种是两个所走矩形不相交,第二种是相交。
上图表示相同颜色是一样长的,,图比较水,见谅。两个点表示给你的两个点。
上面表示两种情况。
求得是黑框内红框外的面积。
代码:
View Code
int main() { int t; scanf("%d",&t); while(t--) { int n,m,x1,y1,x2,y2; ll a,b; ll sum=0; scanf("%d%d%d%d%d%d",&n,&m,&x1,&y1,&x2,&y2); if(y1>y2) swap(y1,y2); if(x1>x2) swap(x1,x2);//变成左上 右下的形式,我看着顺眼。 a=abs(x2-x1); b=abs(y2-y1); a=x1+n-x2;//算长 b=y1+m-y2;//宽 sum=a*b*2;//两个矩形是一样的 if(a*2>n&&b*2>m)//重叠 { sum-=(a*2-n)*(b*2-m); } sum=(ll)n*m-sum; printf("%lld\n",sum); } }