妞妞公主新得到一块白色棋盘。这块棋盘共有n行m列,任意相邻的两个格子都是不同的颜色(黑或白),坐标位(1,1)的格子是白色的。
这一天牛牛来看妞妞公主时,牛牛公主正望着棋盘发呆。牛牛看妞妞公主闷闷不乐的样子,便对妞妞公主说:“只要你告诉我n和m,我能马上算出黑色方块的白色方块的数量。”
“这太简单了。”妞妞公主想了一会,“我会在这n行m列中选择一个左下角坐标位(x0,y0)。右上角坐标为(x1,y1)的矩形,把这个矩形里的共(x1-x0+1)*(y1-y0+1)个方块全部涂白。你还能马上算出黑色方块和白色方块的数量吗?”
“这太简单了。”牛牛自信一笑,“你还可以在执行涂白操作后再选择一个左下角坐标为(x2,y2),右上角坐标为(x3,y3)的矩形,把这个矩形里的方块全部涂黑。我依然能马上算出黑色方块和白色方块的数量。”
妞妞公主终于惊讶地睁大了眼睛,于是抛出了她的T次提问。
聪明的牛牛当然会做了,但是他想把这个问题交给你,请帮牛牛算出每次提问棋盘的黑白方块数目吧。
第一行一个整数T,表示妞妞公主一共提问了T次。
接下来3T行,
第(1+3i)行两个整数n,m。表示第i次提问时棋盘的大小;
第(2+3i)行四个整数x0,x1,y0,y1。表示第i次提问时涂白操作选取的两个坐标。
第(3+3i)行四个整数x2,y2,x3,y3。表示第i次提问时涂黑操作选取的两个坐标。
1<=T<=10000,1<=x<=n<=1000000000,1<=y<=m<=1000000000,x0<=x1,y0<=y1,x2<=x3,y2<=y。
共T行,每行两个整数分别表示白色方块的数量和黑色方块的数量。
输入样例:
3
1 3
1 1 1 3
1 1 1 3
3 3
1 1 2 3
2 1 3 3
3 4
2 1 2 4
1 2 3 3
输出样例:
0 3
3 6
4 8
package com;
/**
* @Description 腾讯19年秋招笔试 妞妞的问题
* @auther lx
* @create 2019-06-19 22:37
*/
public class niuniu {
//n行m列,x,y数组代表4个矩形点坐标的x,y位置
public static int[] nums(int n,int m,int[] x,int[] y){
int[] res = new int[2];//返回值 res[o]白方块的数量,res[1]为黑的
int black = n * m / 2;//当总方块数是偶数,黑白各一半;为奇数时,白方块多一个
int white = n * m - black;
int a,b,c,d,e;
//第一步将(x0,y0),(x1,y1)矩形内的方块都涂白,也就是计算出黑方块的个数d,
// 将白方块个数+d,黑方块-d
if(((x[0] + y[0]) & 1) == 1)//x,y坐标位置和为奇数,则起始位置是黑方块
//如果矩形中方块数为奇数,则黑方块多一个
d = ((x[1] - x[0] + 1) * (y[1] - y[0] + 1) + 1) / 2;
else
//否则,黑白个数一样
d = ((x[1] - x[0] + 1) * (y[1] - y[0] + 1)) / 2;
white += d;
black -= d;
//第二步将(x2,y2),(x3,y3)矩形内的方块都涂黑,也就是计算出白方块的个数d,
// 将白方块个数-d,黑方块+d
if(((x[2] + y[2]) & 1) == 0)//x,y坐标位置和为奇数,则起始位置是黑方块
//如果矩形中方块数为奇数,则白方块多一个
d = ((x[3] - x[2] + 1) * (y[3] - y[2] + 1) + 1) / 2;
else
//否则,白黑个数一样
d = ((x[3] - x[2] + 1) * (y[3] - y[2] + 1)) / 2;
white -= d;
black += d;
//第三步,找到两个矩形的公共部分,该部分中在第一步将所有方块涂白了,
// 而第二步计算依然按照没涂白之前的计算,也就是少算了第一步之前的黑方块个数
//也就是第一步多计算的白方块e,
//最后白方块个数-e,黑方块个数+e
a = Math.max(x[0],x[2]);
b = Math.max(y[0],y[2]);
c = Math.min(x[1],x[3]);
d = Math.min(y[1],y[3]);
if(c < a || d < b)//没有公共部分
e = 0;
else{
if(((a + b) & 1) == 1)//x,y坐标位置和为奇数,则起始位置是黑方块
//如果矩形中方块数为奇数,则黑方块多一个
e = ((c - a + 1) * (d - b + 1) + 1) / 2;
else
//否则,黑白个数一样
e = ((c - a + 1) * (d - b + 1)) / 2;
}
white -= e;
black += e;
res[0] = white;
res[1] = black;
return res;
}
public static void main(String[] args) {
int times = 3;
int[] n = new int[]{1,3,3};
int[] m = new int[]{3,3,4};
int[][][] xAndY = new int[][][]{{{1,1,1,1},{1,3,1,3}},{{1,2,2,3},{1,3,1,3}},
{{2,2,1,3},{1,3,2,3}}};
for (int i = 0;i < times;i++){
int[] res = nums(n[i],m[i],xAndY[i][0],xAndY[i][1]);
System.out.println(res[0]+","+res[1]);
}
}
}