在广阔的平原上,散布着 $N$ 只山羊在悠闲地吃草。没有任何两只山羊位于同一个位置。山羊很懒,不会移动位置,偶尔只会在原地转动。事实上,这些山羊都是机器人,无法行走,只能在原地旋转。此外,山羊的鼻子可以通过 LED 等进行远程点亮,山羊的眼睛是高性能摄像头,拍摄的影像可以实时远程确认,并能保存想要的场景。在山羊的眼中可以看到自己的鼻子,并且具有透视功能,即使山羊重叠在一起,也能识别出有几只。此外,眼睛的左右视野角为 $180^\circ$,即使在边界上的物体也能看到。
根据山羊的位置,有的山羊一次能看到 $N$ 只,而根据情况,有的山羊无论看向哪个方向,一次都无法看到 $N$ 只。例如,给定从 $0$ 号到 $5$ 号共六只山羊时,$5$ 号山羊一次可以看到六只,但 $2$ 号山羊无论看向哪个方向,都无法一次看到全部六只。
为了进行一项特殊的实验,我们选择两只一次能看到 $N$ 只的山羊,并从其余所有山羊中随机选择一只。让选定的三只山羊点亮鼻子,以便随时确认它们的位置。观察选定的三只山羊眼中拍摄的影像,并将三只山羊出现在同一画面中的场景分别为每只山羊保存一份。依次查看保存的三个场景,对与点亮的三只山羊以及点亮的另外两只山羊之间(包含边界)的所有山羊进行特殊标记。这个标记是为了特殊实验而设的,本实验的目标是求出在 $N$ 只山羊中,三次都被标记的山羊的数量。
例如,在总共六只山羊中,若选定的三只山羊用红点表示,下图展示了以每只山羊为基准被特殊标记的山羊。(当然,每张图并不是保存的场景本身。)在这种情况下,三次都被标记的山羊数量为 $4$。
你需要实现以下两个函数:
void init(int x[], int y[]):该函数在最开始被调用,且仅调用一次。$x$ 和 $y$ 是大小为 $N$ 的数组(vector)。山羊的位置坐标作为参数给出,第 $i$ 只山羊($0 \le i \le N-1$)的位置为 $(x[i], y[i])$。int count(int a, int b, int c):利用给定的三只山羊的坐标 $(x[a], y[a]), (x[b], y[b]), (x[c], y[c])$,计算并返回三次都被标记的山羊数量。
实现细节
你需要提交一个名为 goat.cpp 的文件。该文件中必须实现以下函数:
void init(int x[], int y[])int count(int a, int b, int c)
这些函数必须按照上述说明进行操作。当然,你可以创建其他函数并在内部使用。提交的代码不得执行输入输出操作或访问其他文件。
输入格式
提供的 grader 按以下格式读取输入:
- 第 1 行:$N \ Q$($N$:山羊的数量,$Q$:查询的次数)
- 接下来的 $N$ 行:$x \ y$(山羊位置的 $x$ 坐标和 $y$ 坐标)
- 接下来的 $Q$ 行:$a \ b \ c$(三只山羊的编号,$0 \le a, b, c \le N-1$)
提供的 grader 会针对每次查询输出满足条件的山羊数量,并以换行符分隔。
数据范围
- $3 \le N \le 3,000$
- $1 \le Q \le 5 \times 10^6$
- 所有山羊的 $x$ 坐标和 $y$ 坐标均在 $0$ 到 $10^9$ 之间
子任务
- 子任务 1 [5 分]:$N \le 500, Q \le 10^5$,且没有任何三点共线。
- 子任务 2 [17 分]:$N \le 3,000, Q \le 5 \times 10^6$。
- 子任务 3 [10 分]:$N \le 500$,且没有任何三点共线。
- 子任务 4 [8 分]:$N \le 500$。
- 子任务 5 [29 分]:没有任何三点共线。
- 子任务 6 [31 分]:无额外限制。
样例
样例输入 1
6 3 0 0 1 1 2 2 4 3 0 2 2 0 0 5 2 1 3 4 4 1 5
样例输出 1
4 4 3
说明
下表展示了针对样例 1 的函数调用及其结果:
| 函数调用 | 结果值 |
|---|---|
init({0, 1, 2, 4, 0, 2}, {0, 1, 2, 3, 2, 0}) |
|
count(0, 5, 2) |
4 |
count(1, 3, 4) |
4 |
count(4, 1, 5) |
3 |