完成了我人生第二道 CDQ 分治题(上一道是我自己出的)……
告诉我,你和 JZOJ 4419 啥关系(
考虑如何判定一个点是否在一个等腰直角三角形内部。
这里以 (x,y),(x+z,y),(x,y+z) 组成的三角形为例(即 type=1 的情况)。
显然点 (x′,y′) 在这个三角形内部,当且仅当 x+y≤x′+y′≤x+y+z,x≤x′,y≤y′。
首先假设所有询问都在修改后。
看起来是个三维偏序。然而,实际上,容易发现,若 x+y≤x′+y′≤x+y+z,则在剩下的两个条件中,必定至少满足一个。
这意味着什么?
这意味着,仅需用总数分别减去不满足其中一个条件的数量即可。
这样就变成二维偏序了。
当然,再套路地做两次二维偏序很麻烦……
所以实际上可以对 x+y 做扫描线,然后用两个树状数组分别维护 x 和 y 的贡献。
这样就可以一遍扫描线解决一个一维偏序(雾,但是没说错啊)和两个二维偏序了。
然后丢上 CDQ 分治即可。
复杂度 O(nlog2n)。
代码:
1 |
|