Sequence Pair Weight
题意:
一个数组a,其中两个一样的数的贡献为1,问这个数组的所有子串的贡献和是多少?
题解:
举例:
对于[1,2,1,2,1,1,4]
我们考虑第三个1,他会有什么贡献?
(x表示不选)
第一个1和他配对的情况:
[1,2,1,2,1,x,x]
[1,2,1,2,1,1,x]
[1,2,1,2,1,1,4]
第二个1和他配对的情况:
[x,2,1,2,1,x,x]
[x,2,1,2,1,1,x]
[x,2,1,2,1,1,4]
[x,x,1,2,1,x,x]
[x,x,1,2,1,1,x]
[x,x,1,2,1,1,4]
大家有看出什么规律吗?
对于第三个1,他的贡献为在他之前的所有1的长度(这个长度为两个1之间的长度),比如第一个1的长度为1(到数组头),第二个1的长度为2(到第一个1),然后乘以第三个1后面的数量,因为后面数可以顺着跟
仔细看看上面的举例分析就明白了
代码:
#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
int T,a[100050],n;
long long ans;
map<long long,long long> mp;
int main()
{scanf("%d",&T);while(T--){ans=0;mp.clear();scanf("%d",&n);for (int i=1;i<=n;i++){scanf("%d",&a[i]);}for (int i=1;i<=n;i++){ans=ans+(n-i+1)*mp[a[i]];mp[a[i]]+=i;}printf("%lld\n",ans);}
}