记录编号 335537 评测结果 AAAAAAAAAA
题目名称 [NOIP 2015PJ]求和 最终得分 100
用户昵称 Gravatar千世断魂自凝眉 是否通过 通过
代码语言 C++ 运行时间 0.560 s
提交时间 2016-11-02 14:38:43 内存使用 5.63 MiB
显示代码纯文本
#include<cstdio>
#include<cstring>
#define mod 10007
#define LL long long
using namespace std;
const int maxn=100005;
LL n,m;
LL ans=0;
LL num[maxn],col[maxn],head[maxn],Last[maxn]={0},Next[maxn],odd[maxn],even[maxn],Odd,Even;

void Init(){
	if(odd[0]>1){
		for(int i=1;i<=odd[0];i++)
			ans=(ans+(num[odd[i]]*(((odd[0]-2)*odd[i]%mod)%mod+Odd))%mod)%mod;
	}
	if(even[0]>1){
		for(int i=1;i<=even[0];i++)
			ans=(ans+(num[even[i]]*(((even[0]-2)*even[i]%mod)%mod+Even))%mod)%mod;
	}
}

int main()
{
	freopen("2015sum.in","r",stdin);
	freopen("2015sum.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)scanf("%lld",&num[i]);
	for(int i=1;i<=n;i++){
		scanf("%lld",&col[i]);
		if(!Last[col[i]]) head[col[i]]=i;
		if(Last[col[i]]) Next[Last[col[i]]]=i;	
		Last[col[i]]=i;
	}
	for(int i=1;i<=m;i++){
		int t=head[i];
		odd[0]=even[0]=0;
		Odd=Even=0;
		while(t){
			if(t&1){Odd+=t;odd[++odd[0]]=t;}
			else{Even+=t;even[++even[0]]=t;}
			t=Next[t];
		}
		Init();
	}
	printf("%lld\n",ans%mod);
	return 0;
}