P2671 [NOIP2015 普及组] 求和


这道题我用到一些小tricks

1.容易发现x+z必然为偶数,所以可以用i*2指代偶数,i*2+1指代奇数,像扫描线那样构造。

2.对于涉及大量运算的某个恒量,尽量用const 事先标明,出于某种我还不会的神奇原理,加了const 对于取模等场合,在速度上的优化是非常惊人的。

3.push_back()->emplace_back()        

4.cin->scanf

下面是代码:

在洛谷提交需要开O2,因为用了STL

#include
#define p cout << "***";
#define rep(i,x,n) for(int i=x;i<=n;++i)
using namespace std;
const int mod=10007;
int n,m;
int a[100010];
int b[100010];
vector v[200010];
main()
{
	
	cin >> n >> m;
	rep(i,1,n) {scanf("%d",&a[i]);a[i]%=mod;}
	rep(i,1,n) scanf("%d",&b[i]);
	rep(i,1,n) v[b[i]*2+i%2].emplace_back(i);
	int ans=0;
	rep(i,1,m*2+1)
	{
		int len=v[i].size();
		if(len<2) continue;
		rep(j,0,len-1)
		rep(k,j+1,len-1)
		{
			ans+=(1LL)*(v[i][j]+v[i][k])*(a[v[i][j]]+a[v[i][k]])%mod;
			ans%=mod;
		} 
	}
	cout << ans;
}