推荐在 cnblogs 上阅读
Solution
题意简述
二维平面上有 N N N 个点 ( x 1 , y 1 ) , … , ( x N , y N ) (x_1,y_1),\dots,(x_N,y_N) (x1,y1),…,(xN,yN) 和一个非负整数 D D D。
求有多少对点对 ( x , y ) (x,y) (x,y) 满足 ∑ i = 1 N ( ∣ x − x i ∣ + ∣ y − y i ∣ ) ≤ D \sum\limits_{i=1}^N (|x-x_i|+|y-y_i|)\le D i=1∑N(∣x−xi∣+∣y−yi∣)≤D。
思路
发现 x i x_i xi 与 y i y_i yi 的捆绑关系不强(其实是几乎没有关联),所以我们分开考虑,也就是先考虑 ∑ i = 1 n ∣ x − x i ∣ \sum\limits_{i=1}^n|x-x_i| i=1∑n∣x−xi∣,得到结论后另外一边也是一样的。
见到绝对值先拆绝对值,我们可以先对 x i x_i xi 排个序,就可以通过枚举知道 x x x 的相对位置,结合前缀和,可以 O ( 1 ) O(1) O(1) 得到上面这个和式的值。设这个值为 A x A_x Ax,我们可以直接枚举 x ∈ [ − 1 0 6 , 1 0 6 ] x\in [-10^6,10^6] x∈[−106,106],然后 O ( M ) O(M) O(M) 得到 A x A_x Ax。另外一边照葫芦画瓢,也可以快速得知 B y B_y By 的值。
现在考虑计数。首先可以枚举值域内的每个 x x x,枚举中的子任务为求有多少个 y y y 满足 B y ≤ D − A x B_y\leq D-A_x By≤D−Ax。这是很简单的,对所有 B y B_y By 排个序,二分答案即可。