您的位置:首页 > 其它

2017.9.10 土地购买 思考记录

2017-09-10 10:34 176 查看
、、这个题结论还是比较好猜的、

就是把土地按长为第一关键字,宽为第二关键字,这样就可以省去许多包含的土地

剩下的就是长度递增、宽递减的土地:



剩下的就是斜率优化了,但wa了好几遍,,这是因为:

1、数学不好,长宽单调性看成相同的了

2、没开long long

3、斜率精度误差

4、<=和>=反了、

所以:

1、除法比较时一定要注意是不是有误差

2、准确理解斜率优化的意义

3、尝试找规律和归类法分析问题、

码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#define ll long long
using namespace std;
ll n,i,cnt,x[100005],y[100005],f[100005];
struct la
{
ll c,k;
}a[100005],b[100005];
bool cmp(la a,la b)
{if(a.c!=b.c)
return a.c<b.c;
return a.k<b.k;
}
int main()
{
scanf("%lld",&n);
for(i=1;i<=n;i++)
{
scanf("%lld%lld",&a[i].c,&a[i].k);
}
sort(a+1,a+1+n,cmp);
for(i=n;i>=1;i--)
{
if(a[i].k>b[cnt].k)
b[++cnt]=a[i];
}
for(i=1;i<=cnt;i++)
a[i]=b[i];
n=cnt;
int z1=1,z2=1;
x[1]=a[1].c;
y[1]=0;
for(i=1;i<=n;i++)
{
while(z1<z2&&double(y[z1]-y[z1+1])/double(x[z1]-x[z1+1])>=-a[i].k)++z1;
ll lx,ly;
ly=y[z1]+x[z1]*a[i].k;
f[i]=ly;
lx=a[i+1].c;
while(z2-z1>=1&&double(y[z2]-ly)/double(x[z2]-lx)>=double(y[z2-1]-ly)/double(x[z2-1]-lx))--z2;
++z2;
y[z2]=ly;
x[z2]=lx;
}
printf("%lld",f
);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: