题目
题意: 给你一个序列有n个数字 一个子区间的val:该区间内不同数字的个数 问这个序列的所有子区间val的和。
思路: 单纯的考虑每个元素。 每个元素的贡献就是可能会有多少区间里面含有这个元素并且这个元素可以发挥作用 不是多余的。
[这个元素上次出现的位置+1,当前]*[当前,n] 总有二者相乘这么多个贡献。
意思就是尽管一个区间可能有多个x 但是只其中一个x计算这个贡献了。
#include<iostream>
using namespace std;
typedef long long ll;
const int N=1e5+5;
int vis[N];
int main(){
ll ans=0;int n,x;scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&x),ans+=(ll)(n-i+1)*(i-vis[x]),vis[x]=i;
printf("%lld\n",ans);
}
版权声明:本文为qq_42576687原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。