记录编号 |
168119 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[USACO Mar09]餐厅清扫 |
最终得分 |
100 |
用户昵称 |
cstdio |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.129 s |
提交时间 |
2015-07-01 11:39:09 |
内存使用 |
0.97 MiB |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int SIZEN=40010;
int N,M;
int B;
int P[SIZEN];
int F[SIZEN]={0};
int last[SIZEN]={0};
int occur[SIZEN]={0};
int pos[SIZEN]={0};
void work(void){
for(int i=1;i<=N;i++){
last[i]=occur[P[i]];
occur[P[i]]=i;
}
pos[0]=1;
for(int i=1;i<=N;i++){
int k=last[i],j;
for(j=0;j<=B&&pos[j]-1!=k;j++);
for(j--;j>=0;j--) pos[j+1]=pos[j];
pos[0]=i+1;
F[i]=i;
for(int j=1;j<=B;j++){
F[i]=min(F[i],F[pos[j]-1]+j*j);
}
}
printf("%d\n",F[N]);
}
void read(void){
scanf("%d%d",&N,&M);
B=sqrt(N+0.0);
for(int i=1;i<=N;i++) scanf("%d",&P[i]);
}
int main(){
freopen("cleanup.in","r",stdin);
freopen("cleanup.out","w",stdout);
read();
work();
return 0;
}