题目概述
有 n 块土地,每块土地有长
解题报告
由于要买下所有土地,所以如果对于
然后就会发现这是线性DP,
示例程序
#include<cstdio>
#include<algorithm>
#define fr first
#define sc second
using namespace std;
typedef long long LL;
const int maxn=50000;
int n;pair<int,int> a[maxn+5];
int Head,Tail,que[maxn+5];LL f[maxn+5];
inline bool cmp(pair<int,int> a,pair<int,int> b) {return a>b;}
inline LL X(int i,int j) {return a[i+1].fr-a[j+1].fr;}
inline LL Y(int i,int j) {return f[j]-f[i];}
int main()
{
freopen("program.in","r",stdin);
freopen("program.out","w",stdout);
scanf("%d",&n);for (int i=1;i<=n;i++) scanf("%d%d",&a[i].fr,&a[i].sc);sort(a+1,a+1+n,cmp);
int Tot=n;n=0;for (int i=1,MAX=0;i<=Tot;i++) if (a[i].sc>MAX) a[++n]=a[i],MAX=a[i].sc;
f[0]=0;Head=1;que[Tail=1]=0;
for (int i=1;i<=n;i++)
{
while (Head<Tail&&Y(que[Head],que[Head+1])<=X(que[Head],que[Head+1])*a[i].sc) Head++;
f[i]=f[que[Head]]+(LL)a[que[Head]+1].fr*a[i].sc;
while (Head<Tail&&Y(que[Tail-1],que[Tail])*X(que[Tail],i)>=Y(que[Tail],i)*X(que[Tail-1],que[Tail])) Tail--;
que[++Tail]=i;
}
printf("%lld\n",f[n]);
return 0;
}