NOIP 2015 求和

P2671

读题,我们发现完全可以暴力O(n^{3})

那这必然过不了

观察题目,对式一进行移项,发现x+z=2y

于是我们便可以枚举x,zy

当然这个复杂度也是过不了的

做到这个地步,我们似乎基本没有用到颜色

于是我们便可以向颜色上靠,可以利用分组的思想,将同一颜色分成一组,又根据x+z=2y

可以把相同颜色的分为奇偶两组

那怎么样得出最后答案呢

我们可以对分数的计算:(x+z)*(number_{x}+number_{z}) 进行一定的处理

我们提前设定c[i]为第i个的颜色

s[c[i]][i%2]为颜色为c[i]的个数

我们设f[i]为下标,n[i]为值

(f[1]+f[2])*(n[1]+n[2])+(f[1]+f[3])*(n[1]+n[3])...(f[n-1]+f[n])*(n[n-1]*n[n])

将有关f[1]的式子提出来找规律

(f[1]+f[2])*(n[1]+n[2])......(f[1]+f[n])*(n[1]+n[n])

乘出来

f[1]\cdot n[1]+f[1]\cdot n[2]+f[2]\cdot n[1]+f[2]\cdot n[2]......f[1]\cdot n[1]+f[1]\cdot n[n]+f[n]\cdot n[1]+f[n]\cdot n[n]

将有关f[1]的式子提出来

f[1]\cdot n[1]+f[1]\cdot n[2]......f[1]\cdot n[1]+f[1]\cdot n[n]

(n-1)*f[1]*n[1]+f[1]*(n[2]+n[3]...+n[n])

将这个式子+f[1]*n[1]-f[1]*n[1]

(n-2)*f[1]*n[1]+f[1]*(n[1]+n[2]+n[3]......+n[n])

显然后面的可以用前缀和求出来

#include<cmath>
#include<cstring>
#include<string>
#include<iostream>
#include<cstdio>
#include<vector>
#include<ctime>
#include<unordered_map>
#include<map>
#include<cstdlib>
#include<iomanip>
#include<queue>
#include<set>
#include<stack>
#include<algorithm>
#include<fstream>
using namespace std;
int f[1000000][5],n[1000000][5],nn[1000000][5],ff[1000000][5],X[1000000][5];
int c[1000000],s[1000000][5],y[1000000];
int main()
{
	int k,m;
	cin>>k>>m;
	for(int i=1;i<=k;i++)
		cin>>y[i];
	for(int i=1;i<=k;i++)
	{
		cin>>c[i];
		s[c[i]][i%2]++;
		n[c[i]][i%2]=(n[c[i]][i%2]+y[i])%10007;
	}
	int ans=0;
	for(int i=1;i<=k;i++)
		ans=(ans+i*(1LL*(s[c[i]][i%2]-2)*y[i]+n[c[i]][i%2]))%10007;
	cout<<ans;
	return 0;
}

记得开

long long

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值