比赛 csp2025模拟练习1 评测结果 RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR
题目名称 轻重数字 最终得分 0
用户昵称 梦那边的美好TE 运行时间 113.761 s
代码语言 C++ 内存使用 9.67 MiB
提交时间 2025-10-28 11:40:02
显示代码纯文本
#include <iostream>
#include <cstdio>
using namespace std;
const int N=5e5+10;
const int mod=1000003;
int n,cnt[N],a[N],ans,lst[N],t[N];
long long f[N],s[N];
int ask(int l,int r){
	for(int i=l;i<=r;i++)cnt[a[i]]=0;
	for(int i=l;i<=r;i++)cnt[a[i]]++;
	for(int i=l;i<r;i++)if((cnt[a[i]]>1)==(cnt[a[i+1]]>1))return 0;
	return 1;
}
void PlanB(){
	f[0]=1;
	for(int i=1,l;i<=n;i++){
		l=max(i-100,1);
		for(int j=i;j>=l;j--){
			if(ask(j,i))f[i]=(f[i]+f[j-1])%mod;
		}
	}
	printf("%lld\n",f[n]);
	return;
}
void PlanA(){
	for(int i=1;i<=n;i++){
		lst[i]=t[a[i]];
		t[a[i]]=i;
	}
	f[0]=1,s[0]=1;int l=0;
	for(int i=1;i<=n;i++){
		if(a[i]==1){
			f[i]=f[i-1];			
			if(i-2>=l){
				f[i]+=s[i-3];
				if(l>1)f[i]-=s[l-2];
			}
			f[i]=f[i]%mod+mod;
			f[i]%=mod;
			s[i]=s[i-1]+f[i];
			s[i]%=mod;
		}else{
			l=max(l,lst[i]+1);
			f[i]=f[i-1];
			if(i-3>=l){
				f[i]+=s[i-4];
				if(l>1)f[i]-=s[l-2];
			}
			f[i]=f[i]%mod+mod;
			f[i]%=mod;
			s[i]=s[i-1]+f[i];
			s[i]%=mod;
		}
	}
	printf("%lld\n",f[n]);
	return;
}
int main(){
	freopen("digit.in","r",stdin);
	freopen("dight.out","w",stdout); 
	scanf("%d",&n);bool flag=0;
	for(int i=1;i<=n;i++){
		scanf("%d",a+i);
		if((i&1)&&(a[i]!=1))flag=1;
	}
	if(!flag)PlanA();
	else PlanB();
	
	return 0;
}