对于每个区间,如果有重复的数,我们认为最早出现的那个数有贡献。
例如 1,2,3,4,1,4,51,2,3,4,1,4,51,2,3,4,1,4,5 中,第 1,2,3,4,71,2,3,4,71,2,3,4,7 个数对答案有贡献。
统计每个数对答案的贡献即可。
我们设 jjj 为满足 aj=aia_j=a_iaj=ai 且 j<ij<ij<i 的最大值(若不存在为 000),那么 aia_iai 的贡献就是 (i−j)×(n−i+1)(i-j)\times(n-i+1)(i−j)×(n−i+1),其中 (i−j)(i-j)(i−j) 为左端点的可能数,(n−i+1)(n-i+1)(n−i+1) 为右端点的可能数。
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,a[200005],ans;
unordered_map<int,int>mp;
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
ans+=(i-mp[a[i]])*(n-i+1);
mp[a[i]]=i;
}
cout<<ans;
return 0;
}

被折叠的 条评论
为什么被折叠?



