#include #include #include #include #include using namespace std; const int THRESH = 100; int n, k; int amt[100005]; int xloc[100005]; double lhsutil[100005][THRESH]; double rhsutil[100005][THRESH]; vector> edges[100005]; double dp[100005]; int used[100005]; int check(double penalty) { for(int i = 1; i <= n; i++) dp[i] = -1e100; dp[0] = 0; used[0] = 0; for(int i = 0; i < n; i++) { if(dp[i] > dp[i+1]) { dp[i+1] = dp[i]; used[i+1] = used[i]; } for(auto out: edges[i]) { if(dp[out.first] < dp[i] + out.second - penalty) { dp[out.first] = dp[i] + out.second - penalty; used[out.first] = used[i] + 1; } } } return used[n]; } int main() { cin >> n >> k; for(int i = 0; i < n; i++) cin >> amt[i] >> xloc[i]; for(int i = 0; i < n; i++) { double curr = 0; for(int j = 0; j < THRESH; j++) { if(i - j >= 0) curr += amt[i - j] * pow(2., xloc[i - j] - xloc[i]); else curr = -1e100; lhsutil[i][j] = curr; } } for(int i = 0; i < n; i++) { double curr = 0; for(int j = 0; j < THRESH; j++) { if(i + j < n) curr += amt[i + j] * pow(2., xloc[i] - xloc[i + j]); else curr = -1e100; rhsutil[i][j] = curr; } } for(int i = 0; i < n; i++) { for(int j = i; j < n && j-i < THRESH; j++) { double best = 0; for(int a = i; a <= j; a++) { double cand = lhsutil[a][a-i]; cand += rhsutil[a][j-a]; cand -= amt[a]; best = max(best, cand); } edges[i].emplace_back(j+1, best); } } double lhsd = 0.0, rhsd = 300; double force = -1; for(int qq = 0; qq < 30; qq++) { double mid = (lhsd + rhsd) / 2; int usedamt = check(mid); if(usedamt == k) { force = mid; break; } if(usedamt < k) rhsd = mid; else lhsd = mid; } if(force < 0) force = (lhsd + rhsd) / 2; check(force); cout << fixed << setprecision(12) << dp[n] + k * force << "\n"; }