样例没过,感觉是弹出队头有问题。
#include <iostream>
#include <cmath>
#include <string>
#include <cstring>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <cstdio>
using namespace std;
const int N=5e4,inf=2147483647;
int n,m;
struct land{
int w,l;
}a[N],b[N];
int q[N],f[N];
int head=1,tail;
bool cmp(land x,land y){
return x.w==y.w?x.l>y.l:x.w>y.w;
}
double slope(int x,int y){
return 1.0*(f[x]-f[y])/(a[x+1].w-a[y+1].w==0?1e-9:a[x+1].w-a[y+1].w);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d",&a[i].w,&a[i].l);
sort(a+1,a+1+n,cmp);
int mx=1;
b[++m]=a[1];
for(int i=2;i<=n;i++){
if(a[i].l>a[mx].l){
b[++m]=a[i];
mx=i;
}
}
for(int i=1;i<=m;i++)printf("%d %d\n",a[i].w,a[i].l);
for(int i=1;i<=m;i++){
while(tail>head&&slope(i-1,q[tail])<=slope(q[tail],q[tail-1]))tail--;
q[++tail]=i-1;
while(tail>head&&slope(q[head+1],q[head])<=b[i].l)head++;
int j=q[head];
f[i]=f[j]+b[j+1].w*b[i].l;
// printf("%d %d %d\n",head,tail,f[i]);
}
printf("%d\n",f[m]);
return 0;
}