记录编号 168119 评测结果 AAAAAAAAAA
题目名称 [USACO Mar09]餐厅清扫 最终得分 100
用户昵称 Gravatarcstdio 是否通过 通过
代码语言 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;
}