luogu#P7195. [IOI2019] 折线

[IOI2019] 折线

题目背景

您可以在此处下载输入文件

题目描述

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

为完成这个新设计,你已经标出了二维平面中的 nn小圆点。小圆点 ii1<i<n1 < i < n)的坐标为 (xi,yi)(x_i,y_i)不存在 xx 坐标或 yy 坐标相同的两个小圆点

现在你想要找到一个点序列 (sx0,sy0),(sx1,sy1)(sxk,syk)(sx_0,sy_0),(sx_1, sy_1)\ldots (sx_k, sy_k),由该点序列定义给出的折线需满足:

  • 该折线从 (0,0)(0,0) 开始(即 sx0=0sx_0=0sy0=0sy_0=0),
  • 该折线经过所有的小圆点(它们不必是线段的端点),以及
  • 该折线仅包括水平线段和竖直线段(对于定义该折线的连续两个点,其 xx 坐标或 yy 坐标相等)。

折线可以以任意的方式自相交或自重叠。正式地来说,平面上的每个点可以属于折线中任意数量的线段。

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

你不需要为本题提交任何源代码。

输入格式

每个输入文件的格式如下:

  • 11 行:nn
  • 1+i1+i 行(这里 1<in1<i\le n):xi yix_i\ y_i

输出格式

每个输出文件必须按照如下格式:

  • 11 行: kk
  • 1+j1+j 行(这里 1jk1\le j\le k): sxj syjsx_j\ sy_j

注意,第二行应包含 sx1sx_1sy1sy_1 (也就是说,输出不应当包含 sx0sx_0sy0sy_0)。所有的 sxjsx_jsyjsy_j 均应为整数。

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

提示

样例解释

这个样例并不是任何一个数据,仅仅只是为了帮助您理解题意。

输出也仅仅是一个可能的输出。

限制条件

  • 1n1051\le n\le 10^5
  • 1xi,yi1091\le x_i,y_i\le 10^9
  • 所有 xix_iyiy_i 的值都是整数。
  • 不存在 xx 坐标或 yy 坐标相同的两个小圆点,也就是说,对于所有的 i1i2i_1\not=i_2,都有 xi1xi2x_{i_1}\not=x_{i_2}yi1yi2y_{i_1}\not=y_{i_2}
  • 2×109sxi,syj2×109-2\times 10^9\le sx_i,sy_j\le 2\times 10^9
  • 提交的每个文件(无论是输出文件还是压缩文件)的大小均不能超过 15MB\text{15MB}

计分方式

对每个测试点,你最多能够得到 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

可视化工具

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

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

python vis.py [input file]

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

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

例如:

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