luogu#P11407. [RMI 2020] 寻线 / Nice Lines

    ID: 35299 远端评测题 3000ms 250MiB 尝试: 0 已通过: 0 难度: 7 上传者: 标签>2020交互题Special JudgeRMI(罗马尼亚)

[RMI 2020] 寻线 / Nice Lines

题目背景

译自 8th Romanian Master of Informatics, RMI 2020 D2T2。0.2s,0.25G\texttt{0.2s,0.25G}

不需要引入头文件。在文件头加入

long double query(long double x, long double y);
void the_lines_are(std::vector<int> a, std::vector<int> b);

以评测。


交互库地址:

为了减少计算 Eculidean 距离时的精度损失,本题交互库使用了 tiger2005高精度小数类(感谢 tiger2005 老师)。计算结果将保留小数点后 5050 位然后转换到 long double

为了让交互库不 TLE,我们将时限开大到 3s。

如果发现 SPJ 有锅(具体而言,在其他地方可以通过),请联系搬题人。如果发现高精度小数类有锅,请联系 tiger2005。

题目描述

这是一道(函数式)交互题。

二维笛卡尔坐标系上有 NN 条直线,描述为 fi(x)=aix+bif_i(x)=a_ix+b_i。其中,ai,bia_i,b_i 为整数,且 ai,bi104|a_i|,|b_i|\le 10^4

每次可以选择一个实数点 PP,询问 PP 到这 NN 条直线的(欧几里得)距离之和。通过询问找出这 NN 条直线的解析式。

有两个参数限制询问次数:

  • 欲获得满分,询问次数应不大于 qq
  • 欲获得非零分,询问次数应不大于 QQ

此外,保证直线两两不平行。

实现细节

你不需要,也不应该实现 main 函数。

你需要实现以下的函数:

void solve(int subtask_id, int N);

交互库会调用 solve 函数恰好一次。参数的含义:

  • subtask_id:子任务编号。
  • N:直线数量。

你可以调用以下的函数:

long double query(long double x, long double y);

调用此函数,返回点 (x,y)(x,y) 到每条直线的(欧几里得)距离和。你需要保证 x,y1012|x|,|y|\le 10^{12}

void the_lines_are(std::vector<int> a, std::vector<int> b)

调用此函数恰好一次,描述你找到的 NN 条直线。

输入格式

Sample Grader 按照以下格式读取输入:

第一行,一个正整数 id\mathrm{id},表示子任务编号;

第二行,三个正整数 n,Q,qn,Q,q

接下来 nn 行,每行两个整数 ai,bia_i,b_i

注意你需要自行修改 Sample Grader 的 compute_query() 以获得正确的距离计算结果。

输出格式

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

1
1 10000 10000
1 0


提示

对于 100%100\% 的数据,保证:

  • 1N1021\le N\le 10^2
  • 104ai,bi104-10^4\le a_i,b_i\le 10^4
  • 直线两两不平行。
子任务编号 NN q=q= Q=Q= 特殊性质 得分
1 1 =1 =1 10410^4 10410^4 1111
2 2 =2 =2 1313
3 3 =3 =3 77
4 4 100 \le 100 402402 A 1919
5 5 30 \le 30 2323
6 6 100 \le 100 2727

特殊性质 A:ai,bi500|a_i|,|b_i|\le 500

计分方式:令你询问了 xx 次,则得分系数 kk 计算公式如下

$$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} $$

每个子任务得分为得分系数的最小值乘上子任务满分。