您的位置:首页 > 其它

bzoj 3675 [Apio2014]序列分割(斜率优化)

2017-10-11 22:53 375 查看
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3675

wa,很裸的的斜率优化。。。懒得推柿子了233333

代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+5;
typedef long long ll;
ll f[MAXN][2],sum[MAXN];
int a[MAXN],stk[MAXN];
int now,nxt;
ll getUp(int k,int j)
{
return (f[k][now]-sum[k]*sum[k])-(f[j][now]-sum[j]*sum[j]);
}
ll getDown(int k,int j)
{
return sum[k]-sum[j];
}
int n,k;
void solve()
{
memset(f,0,sizeof(f));
sum[0]=0;
now=0,nxt=1;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
}
//cout<<k<<endl;
while(k--)
{
int l=0,r=0;
stk[0]=0;
for(int i=1;i<=n;i++)
{
while(l<r-1&&getUp(stk[l+1],stk[l])>=-sum[i]*getDown(stk[l+1],stk[l]))
l++;
//cout<<stk[l]<<endl;
f[i][nxt]=f[stk[l]][now]+sum[stk[l]]*(sum[i]-sum[stk[l]]);
while(l<r-1&&getUp(stk[r-1],stk[r-2])*getDown(i,stk[r-1])<=getUp(i,stk[r-1])*getDown(stk[r-1],stk[r-2]))
r--;
stk[r++]=i;
}
now^=1;nxt^=1;
//printf("%lld %d\n",f
[now],k);
}
printf("%lld\n",f
[now]);
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(~scanf("%d%d",&n,&k))
{
solve();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: