Related
In following contests:
核心思路:只把 ui=1 的记录放进拟合。记有效条数 S,以及 Sx=∑xi、Sy=∑yi、Sxx=∑xi2、Sxy=∑xiyi,再算 D=S⋅Sxx−Sx2。S=0 时 w=0、b=0;D=0 时 w=0、b=Sy/S;D=0 时先算 w=(S⋅Sxy−Sx⋅Sy)/D,再算 b=(Sy−w⋅Sx)/S。除法全程保持精确分数,代入 b 时 w 还没有舍入。查询 qj 的预测值是 w⋅qj+b,对这个结果保留 4 位小数;小数点后第 5 位恰好为 5 时,向远离 0 的方向进位。
实现方法:Python 用 Fraction 保存 w、b 和预测值。C++ 用 __int128、Java 用 BigInteger 保存分子和分母,把 w⋅q+b 合成一个分数后再舍入。舍入时先看符号,负数对绝对值处理,乘 10000 后做整数除法,余数的两倍大于等于分母就进一,最后补上 4 位小数。
扫描记录和回答查询各一遍,时间复杂度 O(n+m)。在本题范围里分子分母的位数有上界,一次有理数运算按 O(1) 计。需要存下全部输入,空间复杂度 O(n+m)。
巡检系统用探针读数估计一项指标。读数记为 x,指标记为 y,二者满足直线
y=wx+b
其中 w 是斜率,b 是截距。系统已经采集了 n 条记录。第 i 条记录包含读数 xi、指标 yi 和可用标记 ui。ui=1 表示这条记录有效,参与拟合;ui=0 表示这条记录无效,整条丢弃,不进入下面任何一个求和。
拟合只用有效记录,并且按下面的顺序计算。记有效记录的条数为 S。若 S>0,再记
Sx=∑xi,Sy=∑yi,Sxx=∑xi2,Sxy=∑xiyi
四个求和都只遍历 ui=1 的下标 i。再令
D=S⋅Sxx−Sx2
斜率与截距按下列三种情况确定,计算过程不舍入:
w=(S⋅Sxy−Sx⋅Sy)/D
b=(Sy−w⋅Sx)/S
两处除法都是实数除法。先得到精确的 w,再代入第二式得到 b,中间不对 w 做四舍五入。
拟合完成后有 m 个查询。第 j 个查询给出一个读数 qj,它的预测值是 w⋅qj+b。查询不改变已经求出的 w 和 b。按查询的输入顺序输出这 m 个预测值。输出前对每个预测值单独四舍五入,保留 4 位小数;第 5 位小数恰好为 5 时,向远离 0 的方向进位。w 和 b 本身不先舍入。
第一行两个整数 n、m,分别是记录条数和查询个数。
接下来 n 行,第 i 行三个整数 xi、yi、ui。
接下来 m 行,第 j 行一个整数 qj。
1≤n,m≤1000
∣xi∣,∣yi∣,∣qj∣≤106
ui∈{0,1}
输出 m 行。第 j 行是 qj 的预测值,恰好包含 4 位小数。
输入
3 2
1 1 1
3 2 1
0 100 0
1
5
输出
1.0000
3.0000
说明
第三条记录 u3=0,不进入求和。有效记录是 (x,y)=(1,1) 和 (3,2)。
S=2,Sx=1+3=4,Sy=1+2=3,Sxx=1+9=10,Sxy=1+6=7。
D=2⋅10−42=4。
w=(2⋅7−4⋅3)/4=2/4=1/2。
b=(3−(1/2)⋅4)/2=1/2。
查询 1:(1/2)⋅1+1/2=1,输出 1.0000。
查询 5:(1/2)⋅5+1/2=3,输出 3.0000。
输入
2 1
2 4 1
2 8 1
7
输出
6.0000
说明
两条记录都有效,但 x 都是 2。
S=2,Sx=4,Sy=12,Sxx=8,D=2⋅8−42=0。
因此 w=0,b=12/2=6。查询 7 的预测值是 0⋅7+6=6,输出 6.0000。
In following contests:
© CodeFun2000 · 使用条款
Scan the QR code below with WeChat to sign in
First-time scan will create your account automatically
请使用微信扫描下方二维码完成注册