有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000。现在Farmer John要把这些奶牛分成若干段,定义每段的不河蟹度为:若这段里有k个不同的数,那不河蟹度为k*k。那总的不河蟹度就是所有段的不河蟹度的总和。
标签:
有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000。现在Farmer John要把这些奶牛分成若干段,定义每段的不河蟹度为:若这段里有k个不同的数,那不河蟹度为k*k。那总的不河蟹度就是所有段的不河蟹度的总和。
第一行:两个整数N,M
第2..N+1行:N个整数代表每个奶牛的编号
一个整数,代表最小不河蟹度
#include<stdio.h> #include<iostream> using namespace std; const int Max=2000000000; const int N=40005; int n,m,i,j,k,x,a[N],b[N],c[N],pre[N],f[N]; int main() { scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { scanf("%d",&x); if(x!=a[k]) a[++k]=x; } for(i=1;i<=k;i++) f[i]=Max; for(i=1;i<=k;i++) { for(j=1;j*j<=k;j++) if(pre[a[i]]<=b[j]) c[j]++; pre[a[i]]=i; for(j=1;j*j<=k;j++) if(c[j]>j) { x=b[j]+1; while(pre[a[x]]>x) x++; b[j]=x;c[j]--; } for(j=1;j*j<=k;j++) f[i]=min(f[i],f[b[j]]+j*j); } cout<<f[k]; return 0; }
bzoj 1584: [Usaco2009 Mar]Cleaning Up 打扫卫生
标签:
原文地址:http://www.cnblogs.com/lwq12138/p/5539226.html