抱歉,您的浏览器无法访问本站

本页面需要浏览器支持(启用)JavaScript


了解详情 >

你需要在平面直角坐标系上进行 qq 次操作。每次操作有两种,要么放置一个两条直角边平行于坐标轴的等腰直角三角形,要么查询某一个点被多少个三角形覆盖。保证所有点的坐标都是整数且 [1,n]\in [1,n]n5×103,q105n \le 5 \times 10^3, q \le 10^5

考虑到四种方向是对称的,我们只考虑其中一种情况,比如说直角顶点在左下角的情况,令三个顶点为 (x,y),(x+l,y),(x,y+l)(x,y), (x+l,y), (x,y+l)

首先我们发现需要加的所有点 (x,y)(x',y'),都满足 x+yx+yx+y+lx+y\le x'+y'\le x+y+l,这个东西用一棵树状数组就可以维护:

然后我们就是要减去这两块:

我们考虑如何减去,观察这些点的性质,首先均满足 x+y[x+y,x+y+l]x'+y'\in [x+y,x+y+l],然后其还满足 x<xx'<xy<yy'<y。于是我们可以考虑开两棵二维树状数组,一棵维护下标 (x+y,x)(x+y,x),另一棵维护下标 (x+y,y)(x+y,y),然后在这两棵树状数组上矩阵加即可。

时间复杂度 O(qlog2n)\mathcal{O}(q\log^2n),空间 O(n2)\mathcal{O}(n^2)

代码在这儿

评论