对于每个区间,如果有重复的数,我们认为最早出现的那个数有贡献。
例如 1 , 2 , 3 , 4 , 1 , 4 , 5 1,2,3,4,1,4,5 1,2,3,4,1,4,5 中,第 1 , 2 , 3 , 4 , 7 1,2,3,4,7 1,2,3,4,7 个数对答案有贡献。
统计每个数对答案的贡献即可。
我们设 j j j 为满足 a j = a i a_j=a_i aj=ai 且 j < i j<i j<i 的最大值(若不存在为 0 0 0),那么 a i a_i ai 的贡献就是 ( 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;
}