loj#P3178. 「IOI2019」折线 Part. 1

「IOI2019」折线 Part. 1

Cannot parse: undefinedms error parsing time

题目描述

此题负责评测原题的前 77 个测试点。要评测后 33 个测试点,请前往 3181

阿塞拜疆因地毯而闻名。作为一位地毯设计大师,你在做新设计时想画一条折线。一条折线是二维平面上包含 tt 条线段的线段序列,而这些线段由包含 t+1t+1 个点 p0,ptp_0, \cdots p_t 的点序列按照此规则构成:对所有的 0jt10 \le j \le t-1,都有一条线段连接点 pjp_jpj+1p_{j+1}

为完成这个新设计,你已经标出了二维平面中的 nn小圆点。小圆点 ii1in1 \le i \le n)的坐标为 (x[i],y[i])(x[i], y[i])不存在 xx 坐标或 yy 坐标相同的两个小圆点。

现在你想要找到一个点序列 $(sx[0], sy[0]),(sx[1],sy[1]), \cdots, (sx[k], sy[k])$,由该点序列构成的折线需满足

  • 该折线从 (0,0)(0, 0) 开始(即 sx[0]=0sx[0]=0sy[0]=0sy[0] = 0)。
  • 该折线经过所有的小圆点(它们不必是线段的端点)。
  • 该折线仅包括水平线段和竖直线段(对于构成该折线的连续两个点,其 xx 坐标或 yy 坐标相等)。

折线中的线段可以相交或重叠;换言之,平面上的每个点可以被任意数量的线段覆盖。

本题是一个有部分分的提交答案型题目。请从上方「附加文件」下载 1010 个输入文件,这些文件给出了小圆点的位置。对每个输入文件,你需要提交一个答案文件,描述满足要求的折线。你的得分将取决于折线中的线段数量(参见下面的计分方式一节)。

输入格式

第一行,一个整数 nn,表示小圆点的数量。
i+1i+1 行(1in1 \le i \le n),两个整数 x[i],y[i]x[i], y[i],表示第 ii 个小圆点的坐标。

输出格式

第一行,一个整数 kk,表示在折线中你使用的线段数量。
j+1j+1 行(1jk1 \le j \le k),两个整数 sx[j],sy[j]sx[j], sy[j],表示你选取的点序列中第 jj 个点的坐标。

注意:

  • 不需要输出 sx[0],sy[0]sx[0], sy[0];换言之,第 22 行输出的是 sx[1],sy[1]sx[1], sy[1]
  • sx[j],sy[j]sx[j], sy[j] 都必须为整数。
  • 2109sx[j],sy[j]2109-2 \cdot 10^9 \le sx[j], sy[j] \le 2 \cdot 10^9
4
2 1
3 3
4 4
5 2
6
2 0
2 3
5 3
5 2
4 2
4 4

数据范围与提示

数据范围与限制

对于所有数据:

  • 1n100 0001 \le n \le 100\ 000
  • 1x[i],y[i]1091 \le x[i], y[i] \le 10^9
  • 所有 x[i]x[i]y[i]y[i] 和值都是整数。
  • 不存在 xx 坐标或 yy 坐标相同的两个小圆点,也就是说,对于所有的 i1i2i_1 \neq i_2,都有 x[i1]x[i2]x[i_1] \neq x[i_2],且 y[i1]y[i2]y[i_1] \neq y[i_2]

计分方式

对每个测试点,你最多能够得到 1010 分,如果给出一条非法的折线,你将得到 00 分。否则,得分将根据一个递减序列 c1,,c10c_1, \cdots, c_{10} 来计算。

假设你的解答是一条包含 kk 条线段的合法折线。那么,你将得到

  • ii 分,如果 k=cik=c_i1i101 \le i \le 10
  • i+cikcici+1i+\dfrac{c_i-k}{c_i-c_{i+1}} 分,如果 ci+1<k<cic_{i+1} < k < c_i1i91 \le i \le 9
  • 00 分,如果 k>c1k > c_1
  • 1010 分,如果 k<c10k < c_{10}

可以这样理解:在 k(ci+1,ci)k \in (c_{i+1}, c_i) 这个区间上,你的得分是随着 kk 减小线性增大的。一旦得分,得分一定在 [1,10][1, 10] 区间内。

以下是每个测试点 nncic_i 的信息:

测试点 nn c1c_1 c2c_2 c3c_3 c4c_4 c5c_5 c6c_6 c7c_7 c8c_8 c9c_9 c10c_{10}
11 2020 5050 4545 4040 3737 3535 3333 2828 2626 2525 2323
22 600600 1 2001\ 200 937937 674674 651651 640640 628628 616616 610610 607607 603603
33 5 0005\ 000 10 00010\ 000 7 6077\ 607 5 2135\ 213 5 1255\ 125 5 0815\ 081 5 0375\ 037 5 0205\ 020 5 0125\ 012 5 0085\ 008 5 0035\ 003
44 50 00050\ 000 100 000100 \ 000 75 33675\ 336 50 67150\ 671 50 35950\ 359 50 20350\ 203 50 04750\ 047 50 02550\ 025 50 01450\ 014 50 00950\ 009 50 00350\ 003
55 72 01872\ 018 144 036144\ 036 108 430108\ 430 72 82472\ 824 72 44672\ 446 72 25772\ 257 72 06772\ 067 72 04472\ 044 72 03372\ 033 72 02772\ 027 72 02172\ 021
66 91 89191\ 891 183 782183\ 782 138 292138\ 292 92 80192\ 801 92 37192\ 371 92 15692\ 156 91 94191\ 941 91 91891\ 918 91 90691\ 906 91 90091\ 900 91 89491\ 894
77 100 000100\ 000 200 000200\ 000 150 475150\ 475 100 949100\ 949 100 500100\ 500 100 275100\ 275 100 050100\ 050 100 027100\ 027 100 015100\ 015 100 009100\ 009 100 003100\ 003

再次提醒,此题负责评测原题的前 77 个测试点。

可视化工具

在本题的附加文件中有一个脚本,能让你对输入文件和输出文件进行可视化。

在对输入文件做可视化时,使用如下命令:

python vis.py [input file]

对于某个输入数据,你还可以使用下面的命令对你的解答进行可视化,由于技术方面的限制,所提供的可视化工具仅显示输出文件中的10001000 条线段

python vis.py [input file] --solution [output file]

例如:

python vis.py examples/00.in --solution examples/00.out