A. 施工 B. 蔬菜 正解还是用到了分块的思想: 1.对于出现次数很多的蔬菜,直接用前缀和累计答案。 2.对于出现次数较少的蔬菜,考虑将平方的含义转化为点对。 将一棵蔬菜定义为点$(x,y)$,那么任意相同的两棵蔬菜(可以是同一个棵)可以表示为点对$(x_1,x_2,y_1,y_2)$。 设询问为$(x,y)(X,Y)$,即统计有多少个点对满足: 限制(1):$x<=x_1<=X$ 限制(2):$x<=x_2<=X$ 限制(3):$y<=y_1<=Y$ 限制(4):$y<=y_2<=Y$ 四维偏序问题,可以暴力四维前缀和容斥。 然而空间复杂度$O(n^4)$,开不下。 考虑离线询问,并且将每个询问对于限制(1)拆为两个,即$ans_X-ans_{x-1}$。 将所有点对按$x_1$排序,所有询问按拆成的第一维限制排序。 那么对于每个询问,单调指针不断添加点对到三维数状数组里, 添加完后大力三维容斥统计答案就可以了。 设蔬菜由出现次数决定使用哪种算法统计的分界值为k, 那么本题的复杂度为$O(n^2*\frac{n^2}{k})$(对每种大于k的蔬菜预处理) +$O(n^2*k*log^3n)$(每种蔬菜都恰好接近k个的时候,总的点对最多,对这些点对的预处理。) +$O(q*(\frac{n^2}{k}+log^3n))$(每次询问对于两部分的查询。) C. 联盟