def compute_min(points, H, initial_assign): assignment = initial_assign.copy() prev_assignment = None n = len(points) while assignment != prev_assignment: prev_assignment = assignment.copy() # Compute S and T S = [] T = [] for i in range(n): if assignment[i]: S.append(points[i]) else: T.append(points[i]) # Compute a1 sum_xi2_S = sum(xi * xi for xi, yi in S) sum_xy_S = sum(xi * yi for xi, yi in S) sum_Hx_S = sum(H * xi for xi, yi in S) a1 = (sum_xy_S - sum_Hx_S) / sum_xi2_S if sum_xi2_S != 0 else 0.0 # Compute a2 sum_xi2_T = sum(xi * xi for xi, yi in T) sum_xy_T = sum(xi * yi for xi, yi in T) a2 = sum_xy_T / sum_xi2_T if sum_xi2_T != 0 else 0.0 # Reassign points new_assignment = [] for xi, yi in points: error_f = (yi - (a1 * xi + H)) ** 2 error_g = (yi - a2 * xi) ** 2 new_assignment.append(error_f < error_g) assignment = new_assignment # Calculate the total error total = 0.0 for xi, yi in points: error_f = (yi - (a1 * xi + H)) ** 2 error_g = (yi - a2 * xi) ** 2 total += min(error_f, error_g) return total def main(): import sys input = sys.stdin.read().split() idx = 0 N = int(input[idx]) idx +=1 H = int(input[idx]) idx +=1 points = [] for _ in range(N): x = int(input[idx]) y = int(input[idx+1]) points.append( (x, y) ) idx +=2 # Try two different initial assignments initial_assign1 = [ (yi > H / 2) for xi, yi in points ] initial_assign2 = [ (yi <= H / 2) for xi, yi in points ] sum1 = compute_min(points, H, initial_assign1) sum2 = compute_min(points, H, initial_assign2) min_sum = min(sum1, sum2) # Also try all points assigned to f and all to g # Initial assign all to f initial_assign3 = [True] * N sum3 = compute_min(points, H, initial_assign3) min_sum = min(min_sum, sum3) # Initial assign all to g initial_assign4 = [False] * N sum4 = compute_min(points, H, initial_assign4) min_sum = min(min_sum, sum4) # Print with sufficient precision print("{0:.20f}".format(min_sum).rstrip('0').rstrip('.') if '.' in "{0:.20f}".format(min_sum) else "{0:.20f}".format(min_sum)) if __name__ == "__main__": main()