Description
w × h 是一位神仙。
众所周知,近日长城修得越来越高,across the Great Wall, reach every corner in the world也变得越来越困难。
w × h 想要分析一下某个版本墙的特征。在地图上,土地可以大致用一个无限大的黑白二维矩阵表示,其中用户为白格,墙为黑格。由于墙很高,两个用户能够互相通信当且仅当在网格上这两个白格能够只经过四联通的白格相互到达。
经过一番细致的研究,w × h发现这个地图可以由如下过程迭代构造。
地图上一开始只有一个白格。 一次迭代中,假设原来的地图为 A,那么新的地图为
其中 B 为一个与 A 边长相同且全为黑格的正方形矩阵。 例如三次迭代之后,我们得到了这样一个矩阵(W 表示白格,B 表示黑格):
经过无限次迭代之后,我们就得到了土地对应的黑白矩阵。
无限大的地图,分析起来过于困难。于是 w × h 每次会截出一个子矩阵,他想要知道这个子矩阵中的用户在墙的阻隔下组成了多少个联通块,联通块定义为极大的能够互相通信的用户集合。
由于一次询问不足以分析,w × h 需要进行 q 次询问。
Input
第一行一个正整数 q。
接下来 q 行每行四个正整数 x1 ,y1 ,x2,y2(1≤x1≤x2,1≤y1≤y2 ),表示询问以第 x1行第y1列,第x2行第y2列为两对角的矩形内用户形成的联通块数。
Output
q 行,每行一个正整数,表示对应矩形内的联通块数量。
Sample Input
4
1 1 5 5
2 2 3 6
4 2 7 5
2 2 2 2
Sample Output
1
3
3
0
Data Constraint
思路
下标从0开始编号后可以发现,(i,j)为白格子等价于i&j=0
因为每次迭代相当于添加一个新的二进制位,并把这一位都为1的全染黑
然后有一个性质,下图绿框中的连通块数=蓝框的连通块数
那么我们只需要考虑蓝色区域的连通块数,可以拆成两个一维部分的连通块数之和-左上角为白格子
现在我们的问题变成了一维
然后[l,r]的连通块数=[0,r]-[0,l-1]-[l和l-1都为白色]
那么我们的问题变成了给出x和r,问[0,r]中的连通块数
可以看做是把x中的1和末尾的0去掉,剩余的位在二进制下不断+1
那么我们直接找<=r的最大的这样的数即可。
复杂度O(q log x)