P2671 NOIP 2015 普及组] 求和 解题报告
P2671 NOIP 2015 普及组] 求和 解题报告
首先,我们看三元组满足的条件:
- \(x,y,z\) 都是整数,\(x<y<z,y-x=z-y\)。
- \(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;
}

浙公网安备 33010602011771号