http://www.lydsy.com/JudgeOnline/problem.php?id=1597
就是斜率的几何意义
//#define _TEST _TEST
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
/************************************************
Code By willinglive Blog:http://willinglive.cf
************************************************/
#define rep(i,l,r) for(int i=l,___t=(r);i<=___t;i++)
#define per(i,r,l) for(int i=r,___t=(l);i>=___t;i--)
#define MS(arr,x) memset(arr,x,sizeof(arr))
#define LL long long
#define INE(i,u,e) for(int i=head[u];~i;i=e[i].next)
inline const int getint()
{
int r=0,k=1;char c=getchar();
for(;c<'0'||c>'9';c=getchar())if(c=='-')k=-1;
for(;c>='0'&&c<='9';c=getchar())r=r*10+c-'0';
return k*r;
}
/
int n,tot;
struct data{LL x,y;}d[50005],a[50005];
LL dp[50005];
int q[50005];
/
bool cmp(data a,data b){return a.x<b.x||a.x==b.x&&a.y<b.y;}
double slope(int x,int y)
{return (double)(dp[y]-dp[x])/(a[x+1].y-a[y+1].y);}
/
void input()
{
n=getint();
rep(i,1,n) d[i].x=getint(),d[i].y=getint();
}
void solve()
{
sort(&d[1],&d[n+1],cmp);
rep(i,1,n)
{
while(tot&&d[i].y>=a[tot].y)tot--;
a[++tot].x=d[i].x; a[tot].y=d[i].y;
}
int l=0,r=0;
rep(i,1,tot)
{
while(l<r&&a[i].x>slope(q[l],q[l+1]))l++;
dp[i]=dp[q[l]]+a[q[l]+1].y*a[i].x;
while(l<r&&slope(q[r],i)<slope(q[r-1],q[r]))r--;
q[++r]=i;
}
cout<<dp[tot]<<endl;
}
/
int main()
{
#ifndef _TEST
freopen("std.in","r",stdin); freopen("std.out","w",stdout);
#endif
input();
solve();
return 0;
}