Connecting...

P2671 NOIP 2015 普及组] 求和 解题报告

P2671 NOIP 2015 普及组] 求和 解题报告

首先,我们看三元组满足的条件:

  1. \(x,y,z\) 都是整数,\(x<y<z,y-x=z-y\)
  2. \(color_x=color_z\)

我们先看第一条,等价于 \(x+z=2y\),说明 \(x,z\) 同奇偶。

我们再看第二条,字面意思,颜色相同。

综合一下,奇偶、颜色相同的两个可以产生贡献。我们可以以此为标准去分类。分完之后我们可以做到 \(O(n)\) 统计贡献,下面开始推导,第四项柿子在第四行改写成了等价的形式,第五行到第六行的变化可以画图理解。下面的 \(\left( A_i+A_j\right)\times \left( B_i+B_j\right)\) 等价于 \((x+z)×(number_x+number_z)\)\(n\) 是指这一类的总大小,即代码中的 sz

\[\begin{equation} \begin{aligned} &\sum_{i=1}^{n}\sum_{j=i+1}^{n}\left( A_i+A_j\right)\times \left( B_i+B_j\right)\\ =&\sum_{i=1}^{n}\sum_{j=i+1}^{n}\left( A_iB_i+A_iB_j+A_jB_i+A_jB_j\right)\\ =&\sum_{i=1}^{n}\sum_{j=i+1}^{n}A_iB_i+\sum_{i=1}^{n}\sum_{j=i+1}^{n}A_iB_j+\sum_{i=1}^{n}\sum_{j=i+1}^{n}A_jB_i+\sum_{i=1}^{n}\sum_{j=i+1}^{n}A_jB_j\\ =&\sum_{i=1}^{n}\left(n-i\right)A_iB_i+\sum_{i=1}^{n}\sum_{j=i+1}^{n}A_iB_j+\sum_{i=1}^{n}\sum_{j=i+1}^{n}A_jB_i+\sum_{i=1}^{n}\left(i-1\right)A_iB_i\\ =&\sum_{i=1}^{n}\left(n-1\right)A_iB_i+\sum_{i=1}^{n}\sum_{j=i+1}^{n}A_iB_j+\sum_{i=1}^{n}\sum_{j=i+1}^{n}A_jB_i\\ =&\sum_{i=1}^{n}\left(n-1\right)A_iB_i+\left(\sum_{i=1}^{n}A_i \times \sum_{i=1}^{n}B_i-\sum_{i=1}^{n}A_iB_i\right)\\ =&\sum_{i=1}^{n}\left(n-2\right)A_iB_i+\sum_{i=1}^{n}A_i \times \sum_{i=1}^{n}B_i \end{aligned} \end{equation} \]

我们就做完了,防止膜错,我们用 __int128 草过去。有一个细节,第 \(8\)co[maxn+10][2] 别写成 co[maxn+10][0] 了 QwQ。

code:

#include<bits/stdc++.h>
using namespace std;
#define int __int128
#define ll long long
const int maxn=1e5+10,mod=10007;
ll n,m,p[maxn+10];
int ans;
vector<int>co[maxn+10][2];
signed main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;++i)cin>>p[i];
	for(int i=1;i<=n;++i){
		ll c;cin>>c;
		co[c][i&1].push_back(i);
	}
	for(int i=1;i<=m;++i){
		int sma=0,smb=0,smab=0,sz=co[i][0].size();
		if(sz>1)for(auto v:co[i][0])smab+=p[v]*v,sma+=p[v],smb+=v;
		ans+=(sz-2)*smab%mod+sma*smb%mod;
	
		sma=0,smb=0,smab=0,sz=co[i][1].size();
		if(sz>1)for(auto v:co[i][1])smab+=p[v]*v,sma+=p[v],smb+=v;
		ans+=(sz-2)*smab%mod+sma*smb%mod;
		cerr<<(ll)m<<": "<<(ll)sma<<" "<<(ll)smb<<" "<<(ll)smab<<"\n";
		ans%=mod;
	} 
		
	cout<<(ll)ans;
	return 0;
}
posted @ 2025-02-08 13:59  余亦宸  阅读(28)  评论(0)    收藏  举报