
2 3 2 1 2 4 4 2 4 7 10 1
Case 1: 1 Case 2: 18HintThe answer will fit into a 32-bit signed integer.
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#define maxn 205
#define MAXN 100005
#define mod 100000000
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 1e-6
typedef long long ll;
using namespace std;
int n,m,ans,cnt,tot,flag;
int a[10005],dp[2][10005];
int q[10005];
int sqr(int x)
{
return x*x;
}
int get(int i,int k)
{
return dp[i][k]+a[k+1]*a[k+1];
}
void solve()
{
int i,j,t,dx1,dy1,dx2,dy2,k1,k2,turn=0;
int head,tail;
sort(a+1,a+n+1);
memset(dp,0x3f,sizeof(dp));
dp[0][0]=0;
for(i=1; i<=m; i++)
{
head=0; tail=-1;
q[++tail]=i-1;
for(j=i; j<=n; j++)
{
while(head<tail) // 将不再更新答案的点删除
{
k1=q[head+1];
k2=q[head];
dx1=a[k1+1]-a[k2+1];
dy1=get(turn,k1)-get(turn,k2);
if(dy1<=dx1*2*a[j]) head++;
else break ;
}
dp[turn^1][j]=dp[turn][q[head]]+sqr(a[j]-a[q[head]+1]);
while(head<tail) // 维护下凸曲线
{
dx1=a[j+1]-a[q[tail]+1];
dy1=get(turn,j)-get(turn,q[tail]);
dx2=a[q[tail]+1]-a[q[tail-1]+1];
dy2=get(turn,q[tail])-get(turn,q[tail-1]);
if(dy1*dx2<=dy2*dx1) tail--;
else break ;
}
q[++tail]=j;
}
turn^=1;
}
ans=dp[turn][n];
}
int main()
{
int i,j,t,test=0;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=1; i<=n; i++)
{
scanf("%d",&a[i]);
}
solve();
printf("Case %d: %d\n",++test,ans);
}
return 0;
}
hdu 3480 Division (斜率优化),布布扣,bubuko.com
原文:http://blog.csdn.net/tobewhatyouwanttobe/article/details/36209591