#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e4+10;
int n,nn,l,r;
int dp[N],q[N];
struct Node{
int x,y;
bool friend operator < (Node a,Node b){
if(a.x==b.x) return a.y>b.y;
return a.x>b.x;
}
}a[N];
double slope(int u,int v){
int dx=a[u+1].x-a[v+1].x;
int dy=dp[u]-dp[v];
return 1.0*dy/(1.0*dx);
}
signed main(){
scanf("%lld",&n);
for(int i=1;i<=n;i++) scanf("%lld%lld",&a[i].x,&a[i].y);
sort(a+1,a+n+1);
nn=0;
for(int i=1;i<=n;i++) if(a[nn].y<a[i].y) a[++nn]=a[i];
n=nn;
for(int i=1;i<=n;i++){
while(l<r && slope(q[l+1],q[l])>=-a[i].y) l++;
dp[i]=dp[q[l]]+a[q[l]+1].x*a[i].y;
while(l<r && slope(q[r],q[r-1])<=slope(i,q[r-1])) r--;
q[++r]=i;
}
printf("%lld",dp[n]);
return 0;
}
此代码在插入节点 i 时比较的是 sloper−1,r 和 sloper−1,i ,100昏,本人太弱,有没有大佬提供 hack 数据