#P12507. 「OOI 2024 Day 1」绘制折线

「OOI 2024 Day 1」绘制折线

题目描述

这是一个交互题。

给定平面上 nn 个点 Ai=(xi,yi)A_i = (x_i, y_i),已知所有 xix_i 互不相同,且所有 yiy_i 也互不相同。你的任务是绘制连接这 nn 个点的折线。

折线由一个从 11nn 的排列 p1,p2,,pnp_1, p_2, \ldots, p_n 定义。折线包含 n1n-1 个线段,第一个线段连接点 Ap1A_{p_1}Ap2A_{p_2},第二个线段连接点 Ap2A_{p_2}Ap3A_{p_3},……,最后一个线段连接点 Apn1A_{p_{n-1}}ApnA_{p_n}。注意,线段之间可能相交。

折线的锐度定义为满足 2in12 \leq i \leq n-1 的编号 ii 的数量,其中角 Api1ApiApi+1\angle A_{p_{i-1}} A_{p_i} A_{p_{i+1}} 是锐角,即严格小于 9090^{\circ}

你需要解决以下四个任务:

  1. 找到一条折线,使其锐度达到可能的最大值。
  2. 给定整数 cc,找到一条折线,其锐度 c\leq c
  3. 给定整数 cc,回答 qq 个查询,每个查询由一个整数 kik_i (ckinc)(c \leq k_i \leq n - c) 组成。在第 ii 个查询中,构建一条锐度恰好为 kik_i 的折线。
  4. 给定整数 cc,对于从 ccncn - c 的每个 kk,构建一条锐度恰好为 kk 的折线 p(k)p^{(k)}。作为答案,提供 n2c+1n - 2c + 1 个数字 $\text{hash}\left(p^{(c)}\right), \text{hash}\left(p^{(c+1)}\right), \ldots, \text{hash}\left(p^{(n-c)}\right)$,其中 $\text{hash}(p) = \left( \sum_{i=1}^{n} p_i b^{i-1} \right) \bmod m$ 是排列 pp 的多项式哈希,参数为 b=106+3b = 10^{6} + 3m=109+7m = 10^{9} + 7。然后,回答 qq 个查询,每个查询由一个整数 kik_i (ckinc)(c \leq k_i \leq n - c) 组成。在第 ii 个查询中,提供折线 p(ki)p^{(k_i)},其锐度必须恰好为 kik_i,且哈希值必须与之前提供的 hash(p(ki))\text{hash}\left(p^{(k_i)}\right) 一致。注意,查询将在提供哈希值之后出现。

保证在给定限制下,答案始终存在。

交互方式

第一行包含两个整数 task\text{task}group\text{group} $(1 \leq \text{task} \leq 4, 0 \leq \text{group} \leq 21)$,分别表示需要解决的任务编号和子任务编号。

第二行包含一个整数 nn (3n80000)(3 \leq n \leq 80000),表示平面上的点数量。

接下来的 nn 行,每行包含两个整数 xix_iyiy_i (xi,yi109)(|x_i|, |y_i| \leq 10^{9}),表示点的坐标。保证所有 xix_i 互不相同,所有 yiy_i 也互不相同。

如果 task=1\text{task} = 1,输入数据到此结束,你需要输出一个排列,使其锐度达到最大可能值。交互到此结束。

如果 task1\text{task} \neq 1,下一行包含一个整数 cc (2cn2)(2 \leq c \leq \frac{n}{2})

如果 task=2\text{task} = 2,输入数据到此结束,你需要输出一个排列,其锐度 c\leq c。交互到此结束。

如果 task=4\text{task} = 4,你的程序需要输出 n2c+1n - 2c + 1 个整数 $\text{hash}\left(p^{(c)}\right), \text{hash}\left(p^{(c+1)}\right), \ldots, \text{hash}\left(p^{(n-c)}\right)$,其中 $0 \leq \text{hash}\left(p^{(i)}\right) < 10^{9} + 7$。注意,如果 task=3\text{task} = 3,不需要执行此操作。

后续交互仅在 task=3\text{task} = 3task=4\text{task} = 4 时进行。

下一行包含一个整数 qq (1q50)(1 \leq q \leq 50),表示查询数量。

随后有 qq 行,每行包含一个查询 kik_i (ckinc)(c \leq k_i \leq n - c)。作为回答,你需要在单独的一行中输出一个排列,该排列的锐度必须恰好为 kik_i。如果 task=4\text{task} = 4,该排列的哈希值必须与之前提供的哈希值一致。

注意:由于这是交互题,请确保在输出每行后添加换行符,并清空输出流缓冲区。

1 0
4
2 3
1 8
4 2
0 0







3 2 4 1
2 0
5
-2 0
-1 -1
0 1
2 -2
3 -3
2









5 4 3 1 2

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

3

4












1 2 3 4 5 6

4 5 6 1 3 2

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

2
2

3









534735187 776162084


4 5 1 2 3

1 3 2 5 4

数据范围与提示

详细子任务附加限制及分值如下表所示。其中子任务 00 是样例。

子任务 分值 任务类型 (task\text{task}) nn 限制 cc 限制 附加限制 子任务依赖 备注
11 88 11 n20000n \leq 20000 xi<xi+1x_i < x_{i+1}yi<yi+1y_i < y_{i+1}
22 66 n10n \leq 10 点坐标随机生成
33 55 n1000n \leq 1000 22
44 55 n20000n \leq 20000 232 \sim 3
55 66 141 \sim 4
66 1717 22 n=80000n = 80000 c=800c = 800
77 77 33 xi<xi+1x_i < x_{i+1}yi<yi+1y_i < y_{i+1}
88 44 n=50n = 50 c=25c = 25 点坐标随机生成
99 44 n=200n = 200 c=80c = 80
1010 44 n=1000n = 1000 c=300c = 300
1111 33 n=5000n = 5000 c=600c = 600
1212 33 n=80000n = 80000 c=35000c = 35000
1313 33 c=5000c = 5000 1212
1414 33 c=2000c = 2000 121312 \sim 13
1515 22 c=800c = 800 7,12147, 12 \sim 14
1616 66 44 xi<xi+1x_i < x_{i+1}yi<yi+1y_i < y_{i+1}
1717 33 n=5000n = 5000 c=600c = 600 点坐标随机生成
1818 33 n=80000n = 80000 c=35000c = 35000
1919 33 c=5000c = 5000 1818
2020 33 c=2000c = 2000 181918 \sim 19
2121 22 c=800c = 800 16,182016, 18 \sim 20