BZOJ3675【斜率优化】

来源:互联网 发布:淘宝上衣服尺码表 编辑:程序博客网 时间:2024/06/06 00:00
注意到判断斜率的时候.相等也要删除.
/* I will wait for you */ #include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<ctime>#include<algorithm>#include<iostream>#include<fstream>#include<vector>#include<queue>#include<deque>#include<set>#include<map>#include<string> typedef long long LL;typedef unsigned long long ULL; using namespace std; const int maxn=100010;const int maxm=210;const int maxs=26;const int INF=1<<29;const int P=1000000007;const double error=1e-9; LL c[maxn],f[maxn][2],q[maxn]; LL h(int x,int y,int t){    return (f[x][t]-c[x]*c[x])-(f[y][t]-c[y]*c[y]);} LL g(int x,int y){    return c[x]-c[y];} int main(){    int n,k;scanf("%d%d",&n,&k);         memset(c,0,sizeof(c));          for(int i=1;i<=n;i++) cin>>c[i];    for(int i=1;i<=n;i++) c[i]+=c[i-1];     memset(f,0,sizeof(f));    for(int t=1;t<=k;t++)    {        int head=1,tail=1;q[head]=t;        for(int i=t+1;i<=n;i++)        {            while(tail>head&&h(q[head],q[head+1],~t&1)<=-c[i]*g(q[head],q[head+1])) head++;            int p=q[head];f[i][t&1]=c[p]*(c[i]-c[p])+f[p][~t&1];            while(tail>head&&h(q[tail-1],q[tail],~t&1)*g(q[tail],i)<=h(q[tail],i,~t&1)*g(q[tail-1],q[tail])) tail--;            q[++tail]=i;        }    }         cout<<f[n][k&1]<<'\n';    return 0;}
0 0
原创粉丝点击