QOJ.ac

QOJ

Time Limit: 3 s Memory Limit: 256 MB Total points: 100

#371. 龙 2

Statistics

在 JOI 平原上,人们与龙共同生活。 JOI 平原是一个广阔的坐标平面,具有 $X$ 和 $Y$ 坐标。坐标为 $x$、$Y$ 坐标为 $y$ 的点记作 $(x, y)$。

JOI 平原上有 $N$ 条龙,编号从 $1$ 到 $N$。共有 $M$ 个龙族,编号从 $1$ 到 $M$。第 $i$ 条龙($1 \le i \le N$)始终位于 JOI 平原上的点 $(A_i, B_i)$,其所属族群为 $C_i$。并非所有族群的龙都生活在 JOI 平原上。

在 JOI 平原上,有两个人类村庄,分别位于点 $(D_1, E_1)$ 和 $(D_2, E_2)$。这两个村庄由一条道路连接,该道路是连接这两个村庄点的线段。

点 $(A_1, B_1), \dots, (A_N, B_N)$ 以及点 $(D_1, E_1), (D_2, E_2)$ 互不相同。其中任意三点都不在同一直线上。

有时,龙族之间会发生冲突。如果族群 $a$($1 \le a \le M$)与族群 $b$($1 \le b \le M, a \neq b$)敌对,族群 $a$ 的每一条龙都会向族群 $b$ 的所有龙发射火球。火球会径直飞向目标。在到达目标后,它会继续沿相同方向飞行。因此,火球的轨迹是一条射线。

当族群之间发生冲突时,如果来自某条龙的火球穿过了道路,道路就会受损。你有一份关于未来可能发生的 $Q$ 种龙族冲突的列表。对于每一种可能的冲突,你需要计算穿过道路的火球数量。

任务

给定龙的信息、人类村庄的位置以及龙族之间可能发生的冲突列表,编写一个程序,计算每种冲突中穿过道路的火球数量。

输入格式

从标准输入读取以下数据。

  • 第一行包含两个空格分隔的整数 $N, M$。这意味着 JOI 平原上有 $N$ 条龙,共有 $M$ 个龙族。
  • 接下来的 $N$ 行中,第 $i$ 行($1 \le i \le N$)包含三个空格分隔的整数 $A_i, B_i, C_i$。这意味着第 $i$ 条龙($1 \le i \le N$)位于 JOI 平原上的点 $(A_i, B_i)$,其所属族群为 $C_i$。
  • 接下来的一行包含四个空格分隔的整数 $D_1, E_1, D_2, E_2$。这意味着在 JOI 平原上有两个人类村庄,分别位于点 $(D_1, E_1)$ 和 $(D_2, E_2)$。
  • 接下来的一行包含一个整数 $Q$,表示龙族之间可能发生的冲突数量。
  • 接下来的 $Q$ 行中,第 $j$ 行($1 \le j \le Q$)包含两个空格分隔的整数 $F_j, G_j$。这意味着在第 $j$ 种可能的冲突中,族群 $F_j$ 与族群 $G_j$ 敌对。

输出格式

向标准输出写入 $Q$ 行。第 $j$ 行($1 \le j \le Q$)输出第 $j$ 种族群冲突中穿过道路的火球数量。

数据范围

所有输入数据满足以下条件:

  • $2 \le N \le 30\,000$。
  • $2 \le M \le N$。
  • $-1\,000\,000\,000 \le A_i \le 1\,000\,000\,000$($1 \le i \le N$)。
  • $-1\,000\,000\,000 \le B_i \le 1\,000\,000\,000$($1 \le i \le N$)。
  • $1 \le C_i \le M$($1 \le i \le N$)。
  • $-1\,000\,000\,000 \le D_1 \le 1\,000\,000\,000$。
  • $-1\,000\,000\,000 \le E_1 \le 1\,000\,000\,000$。
  • $-1\,000\,000\,000 \le D_2 \le 1\,000\,000\,000$。
  • $-1\,000\,000\,000 \le E_2 \le 1\,000\,000\,000$。
  • $N + 2$ 个点 $(A_1, B_1), \dots, (A_N, B_N), (D_1, E_1), (D_2, E_2)$ 互不相同。其中任意三点都不在同一直线上。
  • $1 \le Q \le 100\,000$。
  • $1 \le F_j \le M$($1 \le j \le Q$)。
  • $1 \le G_j \le M$($1 \le j \le Q$)。
  • $F_j \neq G_j$($1 \le j \le Q$)。
  • $(F_j, G_j) \neq (F_k, G_k)$($1 \le j < k \le Q$)。

子任务

共有 3 个子任务。各子任务的分数及附加限制如下:

子任务 1 [15 分]

  • $N \le 3\,000$。

子任务 2 [45 分]

  • $Q \le 100$。

子任务 3 [40 分]

  • 无附加限制。

样例

样例输入 1

4 2
0 1 1
0 -1 1
1 2 2
-6 1 2
-2 0 2 0
2
1 2
2 1

样例输出 1

1
2

样例输入 2

3 2
-1000000000 -1 1
-999999998 -1 1
0 0 2
999999997 1 999999999 1
1
1 2

样例输出 2

1

样例输入 3

6 3
2 -1 1
1 0 1
0 3 2
2 4 2
5 4 3
3 9 3
0 0 3 3
6
1 2
1 3
2 1
2 3
3 1
3 2

样例输出 3

4
2
4
0
2
1

Editorials

IDTypeStatusTitlePosted ByLast UpdatedActions
EditorialOpen Official EditorialQingyu- Download

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.