P11407 [RMI 2020] 寻线 / Nice Lines

题目背景

译自 [8th Romanian Master of Informatics, RMI 2020](https://rmi.lbi.ro/rmi_2020/) D2T2。$\texttt{0.2s,0.25G}$。 **不需要引入头文件**。在文件头加入 ```cpp long double query(long double x, long double y); void the_lines_are(std::vector a, std::vector b); ``` 以评测。 --- 交互库地址: - checker.cpp:[https://www.luogu.com.cn/paste/9l2ikcx9](https://www.luogu.com.cn/paste/9l2ikcx9) - interactive_lib.cpp:[https://www.luogu.com.cn/paste/m4jysztc](https://www.luogu.com.cn/paste/m4jysztc) 为了减少计算 Eculidean 距离时的精度损失,本题交互库使用了 [tiger2005](https://www.luogu.com.cn/user/60864) 的 [高精度小数类](https://www.luogu.com.cn/article/5dhvt1ck)(感谢 tiger2005 老师)。计算结果将保留小数点后 $50$ 位然后转换到 `long double`。 为了让交互库不 TLE,我们将时限开大到 3s。 如果发现 SPJ 有锅(具体而言,在其他地方可以通过),请联系搬题人。如果发现高精度小数类有锅,请联系 tiger2005。

题目描述

**这是一道(函数式)交互题。** 二维笛卡尔坐标系上有 $N$ 条直线,描述为 $f_i(x)=a_ix+b_i$。其中,$a_i,b_i$ 为整数,且 $|a_i|,|b_i|\le 10^4$。 每次可以选择一个**实数点** $P$,询问 $P$ 到这 $N$ 条直线的(欧几里得)距离之和。通过询问找出这 $N$ 条直线的解析式。 有两个参数限制询问次数: - 欲获得满分,询问次数应不大于 $q$; - 欲获得非零分,询问次数应不大于 $Q$。 此外,**保证直线两两不平行。** ### 实现细节 你不需要,也不应该实现 main 函数。 你需要实现以下的函数: ```cpp void solve(int subtask_id, int N); ``` 交互库会调用 `solve` 函数恰好一次。参数的含义: - `subtask_id`:子任务编号。 - `N`:直线数量。 你可以调用以下的函数: ```cpp long double query(long double x, long double y); ``` 调用此函数,返回点 $(x,y)$ 到每条直线的(欧几里得)距离和。**你需要保证 $|x|,|y|\le 10^{12}$。** ```cpp void the_lines_are(std::vector a, std::vector b) ``` 调用此函数恰好一次,描述你找到的 $N$ 条直线。

输入格式

Sample Grader 按照以下格式读取输入: 第一行,一个正整数 $\mathrm{id}$,表示子任务编号; 第二行,三个正整数 $n,Q,q$; 接下来 $n$ 行,每行两个整数 $a_i,b_i$。 注意你需要自行修改 Sample Grader 的 `compute_query()` 以获得正确的距离计算结果。

输出格式

Sample Grader 将输出选手程序回答的 $n$ 条直线,以及使用的询问次数。

说明/提示

对于 $100\%$ 的数据,保证: - $1\le N\le 10^2$; - $-10^4\le a_i,b_i\le 10^4$; - **直线两两不平行。** | 子任务编号 | $N $ | $q=$ | $Q=$ | 特殊性质 | 得分 | | :--: | :--: | :--: | :--: |:--: | :--: | | $ 1 $ | $ =1 $ | $10^4$ | $10^4$ ||$11$ | | $ 2 $ | $ =2 $ | $10^4$ | $10^4$ ||$13$ | | $ 3 $ | $ =3 $ | $10^4$ | $10^4$ ||$7$ | | $ 4 $ | $ \le 100 $ | $402$ | $10^4$ | A |$19$ | | $ 5 $ | $ \le 30 $ | $402$ | $10^4$ ||$23$ | | $ 6 $ | $ \le 100 $ | $402$ | $10^4$ ||$27$ | 特殊性质 A:$|a_i|,|b_i|\le 500$。 计分方式:令你询问了 $x$ 次,则得分系数 $k$ 计算公式如下 $$k=\begin{cases} 1, & x\le q \\ \displaystyle 1-0.7\cdot \frac{x-q}{Q-q} & q\lt x\le Q \\ 0, & x\gt Q \end{cases} $$ 每个子任务得分为得分系数的最小值乘上子任务满分。