链接
\(\text{2019南京网络赛-A.The beautiful values of the palace}\)
题意
有一个\(n\times n\)的螺旋数字矩阵,\(n\)一定是奇数,若边长为5则如下:
这个矩阵内有\(m\)个点是有效的(即有一个值为对应螺旋矩阵该位置的值),其他位置都为0。现在有\(p\)次查询\((x1,y1,x2,y2)\),询问\((x1,y1,)、(x2,y2)\)所围成的矩阵之间的所有数的数位和的和是多少。
输入格式:共\(t\)组测试样例,每组样例,第一行三个数\(n,m,p\),接下来\(m\)行,每行一组坐标\((x,y)\),告诉\(m\)个有效点,之后\(p\)行,每行一次查询\((x1,y1,x2,y2)\)。
数据范围:\((t\leq 5,n\leq 10^6),(m,p\leq 10^5)\).
输出格式:每行输出一个查询结果。
分析
螺旋矩阵\((x,y)\)位置的数的计算,这里就不解释了。
看网上说这就是一个二维偏序问题,个人理解:逆序数的求解应该是算是一个一维偏序问题。对于二维偏序问题可以通过对\(x\)来排序,就是一个一维偏序问题了。
设\(sum(x,y)\)表示以\((1,1)\)为左下角,以\((x,y)\)为右上角所包含所有数的数位和的和,对于查询\((x1,y1,x2,y2)\)即要求 \[sum(x2,y2)-sum(x1-1,y2)-sum(x2,y1-1)+sum(x1-1,y1-1)\]
我们就可以把这个查询表示成四个三元组(1为加,-1为减) \[(x2,y2,1),(x1-1,y2,-1),(x2,y1-1,-1),(x1-1,y1-1,1)\]
之后我们将这些每个查询所表示的四个三元组以及\(m\)个有效点的插入在一起按照\(x\)来排序(即离线),我们用树状数组来维护\(sum(x,y)\)(由于\(x\)是升序排列,因此我们只需要使用一个一维数组维护\(1-y\)的数的数位和的和),我们遍历所有离线的操作,如果当前操作是插入\((x,y)\),那么我们就在树状数组的\(y\)位置插入\((x,y)\)位置的数的数位和,对于查询操作细节见代码。
代码
1 |
|