这个是12th浙江省赛的一道题目,当时自己思考了好久才写出来的。
心疼自己,再次做到这道题的时候竟然写不来了,在此放出这道题。
以后自己写的题目一定要记得。
#include<bits/stdc++.h>
using namespace std;
int numpos[100005];//存的是每个数字的上一个位置
int a[100005];//数组
long long bits[100005];//当前数字能创造的贡献
int T,n;
long long ans,temp;
int main()
{
cin >>T;
while(T--)
{
cin>>n;
ans=0;
temp=0;
memset(numpos,-1,sizeof(numpos));
memset(a,0,sizeof(a));
memset(bits,0,sizeof(bits));
for(int i=0; i<n; i++) //数组
cin>>a[i];
for(int i=0; i<n; i++)
{
temp+=a[i];//temp暂存贡献
if(numpos[a[i]]==-1)
//如果这个数字第一次出现,那么对从0开始到这个位置都有贡献,所以a[i]*i,然后更新数字位置
{
numpos[a[i]]=i;
temp+=i*a[i];
}
else
//不是第一次出现,那么就对两个位置中间的数字有贡献
{
temp+=(i-numpos[a[i]]-1)*a[i];
numpos[a[i]]=i;
}
bits[i]=temp;
}
//全加求和,需要注意的是,一定要long long 否则会溢出
for(int i=0; i<n; i++)
{
ans+=bits[i];
}
cout<<ans<<endl;
}
return 0;
}