由题意可得方程 m∑i=1wiS|i−x|=x,其中 x 表示答案,S=m∑i=1wi。
(其实我也不知道是怎么得的)
设 F(x)=m∑i=1|i−x|⋅wi−S⋅x,问题即求 F 的零点。
注意到其中有绝对值,不好直接求。
但是由于 i 均为整数,故若能求得答案的整数部分即可去绝对值。
又注意到 F 单调递减,因为当 x 增大时,前一项增大的量必然不如后一项减小的量。
故可以二分求得最大的使得 F(x)≥0 的 x。
还要动态的话,可以使用线段树维护右端点的 F 值。
代码:
1 |
|
由题意可得方程 m∑i=1wiS|i−x|=x,其中 x 表示答案,S=m∑i=1wi。
(其实我也不知道是怎么得的)
设 F(x)=m∑i=1|i−x|⋅wi−S⋅x,问题即求 F 的零点。
注意到其中有绝对值,不好直接求。
但是由于 i 均为整数,故若能求得答案的整数部分即可去绝对值。
又注意到 F 单调递减,因为当 x 增大时,前一项增大的量必然不如后一项减小的量。
故可以二分求得最大的使得 F(x)≥0 的 x。
还要动态的话,可以使用线段树维护右端点的 F 值。
代码:
1 | #include <cstdio> |
Related Issues not found
Please contact @Alpha1022 to initialize the comment