分析
发现题面就是要我们求这个东西 。这个显然显然单次枚举是 。我们考虑我们维护了一个上凸壳。所以我们只需要找到凸壳的顶点就好了,而考虑到是凸壳,那么考虑三分法解决。
代码
#include<bits/stdc++.h> using namespace std; const int N = 1e6 + 10; int read() { int x = 0,f = 0;char ch = getchar(); while(!isdigit(ch)) {if(ch == '-')f = 1;ch = getchar();} while(isdigit(ch)) {x = x * 10 + ch - '0';ch = getchar();} return f ? -x : x; } #define LL long long const LL inf = 1e18; LL n,m,a[N],b[N]; LL work(LL k) { LL res = inf; for(int i = 1;i <= n;i++) { for(int j = i + 1;j <= n;j++) { res = min((a[i]+a[j])*k+b[i]+b[j],res); } } return res; } int main() { n = read();m = read(); for(int i = 1;i <= n;i++) a[i] = read(),b[i] = read(); LL L = 1,R = m; while(L + 100 <= R) { LL mid1 = L + (R - L) / 3; LL mid2 = R - (R - L) / 3; if(work(mid1) > work(mid2)) R = mid2; else L = mid1; } LL ans = -inf; for(int i = L ;i <= R;i++) ans = max(ans,work(i)); cout << ans << endl; return 0; }