#include<bits/stdc++.h>
using namespace std;
int num[100010];
int pos[100010];
long long dp[100010];
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
int m;
scanf("%d",&m);
memset(num,0,sizeof(num));
memset(pos,-1,sizeof(pos));
memset(dp,0,sizeof(dp));
for(int i=0;i<m;i++)
{
//cin>>num[i];
scanf("%d",&num[i]);
}
dp[0]=num[0];
pos[num[0]]=0;
for(int i=1;i<m;i++)
{
dp[i]=dp[i-1]+(i-pos[num[i]])*num[i];
pos[num[i]]=i;
}
long long ans=0;
for(int i=0;i<m;i++)
{
ans+=dp[i];
}
printf("%lld\n",ans);
}
return 0;
}
看了半天题解
理解了一下
题目求的是连续的子序列
所以可以定义一个dp[i] //表示以数字i结尾的子序列的和
dp[i] = dp[i - 1] + (i - pos[num[i]]) * num[i]; //dp[i]等于以i-1结尾的子序列的和,加上把前面(i - pos[num[i]])个子序列后面都加上num[i].