【bzoj1584】[Usaco2009 Mar]Cleaning Up 打扫卫生

2014年7月30日1,9941

Description

有N头奶牛,每头那牛都有一个标号Pi,1 <= Pi <= M <= N <= 40000。现在Farmer John要把这些奶牛分成若干段,定义每段的不河蟹度为:若这段里有k个不同的数,那不河蟹度为k*k。那总的不河蟹度就是所有段的不河蟹度的总和。

Input

第一行:两个整数N,M

第2..N+1行:N个整数代表每个奶牛的编号

Output

一个整数,代表最小不河蟹度

Sample Input

13 4
1
2
1
3
2
2
3
4
3
4
3
1
4

Sample Output

11

题解

不会做T T看了半天题解

这题首先可以发现最差情况是将数列a分成n段,代价为n

那么一定不能有划分出的一段超过√n个

这样一来每次的转移就是在√n个内了f[i]=min{f[b[j]]+j*j},j<=√n

其中b[j]表示的是从i开始到b[j]+1,共有j个不同的数字

对于b数组的维护,可以随意脑补一下

比如用pre[a[i]]记录a[i]上次出现的位置,c[j]记录b[j]+1到i的不同数字个数

这样每次i++时,先更新c数组,即如果pre[a[i]]<=b[i],那就无视,不然c[j]++

如果c[j]++了,那么就要从b[i]+1开始找一个只在b[j]+1到i出现一次的,删到它为止

复杂度好像应该是n√n了吧