[IOI2007] pairs 动物对数

题目描述

Mirko 和 Slavko 正在玩动物玩具的游戏。 首先,他们要在下图给出的三种玩具模板中选择一种。三种模板分别由一维、二维和三维的网格点(在图中用圆圈表示)组成。 ![](https://cdn.luogu.com.cn/upload/pic/20672.png ) 接下来Mirko 把 $N$ 个小动物玩具放到选中的模板的网格点上。 动物玩具可以走一步到达与它相邻的网格点上(在图中相邻的点之间有一条小短线相连)。两个网格点之间的距离定义为**从一个网格点到另一个网格点所需要移动的最小步数**。 如果两个动物之间的距离小于等于$D$,则它们之间可以互相听见。Slavko 的任务是计算在模板上有多少对动物可以互相听得见。 给定模板的类型、所有动物的位置以及数字$D$,写一个程序计算有多少对动物可以互相听得见。

输入输出格式

输入格式


输入的第一行按顺序给出四个整数: - 模板类型 $B (1 \leq B \leq 3)$; - 玩具动物的数目 $N (1 \leq N \leq 100 000)$; - 动物之间可以互相听得见的最大距离$D (1 \leq D \leq 100 000 000)$; - 模板的大小 $M$ ( 即在输入中允许的最大的坐标值): 当 $B=1$ 时, $M$ 最大是 $75 000 000$. 当 $B=2$时, $M$ 最大是 $75 000$. 当 $B=3$时, $M$ 最大是 $75$. 接下来的$N$ 行每行包含$B$ 个整数,整数之间用空格隔开,表示一个动物玩具的坐标。坐标的取值范围是$1$ 到 $M$ ( 包括$M$ )。 每个网格点可以同时包含多个动物玩具。

输出格式


输出应该包括一个整数,表示可以互相听得见的玩具动物的对数。 注意:使用64 位整数类型计算和输出结果 (在 C/C++ 中用```long long```, 在Pascal 中用```int64``` ) 。

输入输出样例

输入样例 #1

1 6 5 100 
25 
50 
50 
10 
20 
23 

输出样例 #1

4

输入样例 #2

2 5 4 10 
5 2 
7 2 
8 4 
6 5 
4 4 

输出样例 #2

8

输入样例 #3

3 8 10 20 
10 10 10 
10 10 20 
10 20 10 
10 20 20 
20 10 10 
20 10 20 
20 20 10 
20 20 20 

输出样例 #3

12

说明

在30分的测试数据中, 动物数目 $N$ 最多是 $1 000$。 如果成功通过了某一种模板(一维、二维或者三维)的全部测试数据,将会得到至少30分。 对于input 1的解释: 假设动物按给出的顺序编号为$1$到$6$。$4$对互相能够听得到的动物分别是: - 1-5 ( 距离是5) - 1-6 ( 距离是2) - 2-3 ( 距离是0) - 5-6 ( 距离是3) 对于input 2 的解释:$8$对动物分别是: - 1-2 ( 距离是2) - 1-4 ( 距离是4) - 1-5 ( 距离是3) - 2-3 ( 距离是3) - 2-4 ( 距离是4) - 3-4 ( 距离是3) - 3-5 ( 距离是4) - 4-5 ( 距离是3)