H. SQUARE
SUBTASK 20 PT
不断枚举 333 个不同颜色的点,时间复杂度 O(N3)O(N^3)O(N3)。
SUBTASK 60 PT
按 xxx 递增枚举前两个点,那么第三个点的情况被这两个点的 yyy 坐标分为三部分,分别记录 xxx 的后缀这三部分的 x,(x+y),(x−y)x,(x+y),(x-y)x,(x+y),(x−y) 最大值即可快速计算,离散化使支持区间查询,这里因为 NNN 比较小可以暴力更新,时间复杂度 O(N2)O(N^2)O(N2)。在实现时考虑对颜色进行置换,复杂度为 O(N2×6)O(N^2 \times 6)O(N2×6)。
SUBTASK 100 PT
采用扫描线、二位数点。
由于 NNN 较大,暴力更新会超时,采用树状数组或线段树的解法更新。
经过分析可以发现三个点的位置可能是:
1. 两个点在矩形的邻边上且相对,一个点在矩形内部。(共存在 666 组置换,两个边上的点控制了四边的缩小)
2. 两个点在矩形的边上且相边相邻,一个点在矩形邻边上。(共存在 444 组置换,三个点控制了四边的缩小)
首先对于颜色进行排列置换,并对坐标进行四个象限的变换。这样我们可以从左到右钦定颜色加入的顺序。
经过前面的变换,我们按照 xxx 坐标升序,我们发现本质不同的三个点形态只有 yyy 递增,或者先增再减。
第一种可以直接开两个树状数组,把第一个点的 −x−y−x−y−x−y 扔进第一个树状数组,然后由第二点查询传递到第二颗树状数组(这里是为了保证有这样一个点处在中间)。
第二种情况我们可以按顺序加入前两个点,并用扫描线采用二位数点找出第三个点,在线段树上直接赋值(一个对后缀赋值,一个对前缀赋值,那么他们中间的点一定可以两个信息都接受到,并且合并这两个信息得到答案),最终在第三个点的 yyy 坐标处进行单点查询,需要把 xxx 的差加上,线段树里存的是 yyy 的差值和第一个点的 $。。
AC CODE
时间复杂度:O(NlogN×24)O(N \log N \times 24)O(NlogN×24)