题目链接:https://ac.nowcoder.com/acm/contest/888/B
题意:给你一个序列,让你求出 所有子区间的不同数字的个数 总和
思路:找每个数字对总和的贡献,对于一个位置pos的数字x 找到pos前面第一个x出现的位置i,x数字的贡献是
( pos - i + 1) * (n - pos + 1)
记录一下每个数字出现时的的位置
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5 + 5;
ll a[N];
int vis[N];
int main(){
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
memset(vis, -1, sizeof(vis));
ll ans = 0;
for(int i = 0; i < n; i++){
if(vis[a[i]] != -1){
ans += (ll)( n - i) * (i - vis[a[i]]);
}
else{
ans += (ll)(n - i) * (i + 1);
}
vis[a[i]] = i;
}
printf("%lld\n", ans);
return 0;
}