CF1519E Off by One

题目描述

在一张无限大的平面上有 $n$ 个点。第 $i$ 个点的坐标为 $(x_i, y_i)$,其中 $x_i > 0$ 且 $y_i > 0$。这些坐标不一定是整数。 每次操作你可以进行如下步骤: - 选择两个不同的点 $a$ 和 $b$($a \neq b$); - 将点 $a$ 从 $(x_a, y_a)$ 移动到 $(x_a + 1, y_a)$ 或 $(x_a, y_a + 1)$; - 将点 $b$ 从 $(x_b, y_b)$ 移动到 $(x_b + 1, y_b)$ 或 $(x_b, y_b + 1)$; - 移除点 $a$ 和 $b$。 但是,只有当存在一条直线经过点 $a$ 的新坐标、点 $b$ 的新坐标以及 $(0, 0)$ 时,才能进行上述操作。 否则,操作无法进行,点 $a$ 和 $b$ 保持原坐标不变。 点的编号在移除后不会改变。被移除的点不能再被选中。注意,每次操作必须移动两个点,不能让它们保持原地不动。 你能进行的最多操作次数是多少?这些操作分别是哪些? 如果有多种方案,输出任意一种均可。

输入格式

第一行包含一个整数 $n$($1 \le n \le 2 \cdot 10^5$),表示点的数量。 接下来的 $n$ 行,每行包含四个整数 $a_i, b_i, c_i, d_i$($1 \le a_i, b_i, c_i, d_i \le 10^9$)。第 $i$ 个点的坐标为 $x_i = \frac{a_i}{b_i}$,$y_i = \frac{c_i}{d_i}$。

输出格式

第一行输出一个整数 $c$,表示你能进行的最多操作次数。 接下来的 $c$ 行,每行输出两个整数 $a$ 和 $b$($1 \le a, b \le n$,$a \neq b$),表示本次操作中被移除的两个点。对于每一对 $(a, b)$,应当存在一种移动方式,使得点 $a$ 和 $b$ 的新坐标与 $(0, 0)$ 共线。每个被移除的点不能再被选中。 如果有多种方案,输出任意一种均可。操作顺序和每次操作中点的顺序均可任意。

说明/提示

以下是第一个样例中被选中进行操作的点及其移动示意图: ![](https://cdn.luogu.com.cn/upload/vjudge_pic/CF1519E/552d757ed4044221f43bfc2dbbc4063ed579283e.png) 由 ChatGPT 4.1 翻译